2013-08-03 5 views
3

Je demande parce que j'ai récemment fait une modification à un script KornShell (ksh) qui était en cours d'exécution. Peu de temps après avoir enregistré mes modifications, le processus d'exécution a échoué. A en juger par le message d'erreur, il semblait que le processus en cours avait vu certains - mais pas tous - de mes changements. Cela suggère fortement que lorsqu'un script shell est appelé, le script entier n'est pas lu en mémoire.Les scripts shell sont-ils lus intégralement lorsqu'ils sont invoqués?

Si cette conclusion est correcte, cela suggère d'éviter d'apporter des modifications aux scripts en cours d'exécution.

$ uname -a 
SunOS blahblah 5.9 Generic_122300-61 sun4u sparc SUNW,Sun-Fire-15000 
+0

Cette question peut être une duplicité de [déjà répondu à la question] (http://stackoverflow.com/questions/3398258/edit-shell-script-while-its-running). – LRA

+2

Les scripts shell sont lus en blocs, donc s'il y a une grosse boucle, alors tout le matériel pour la boucle sera lu, mais le matériel au-delà n'aura peut-être pas été traité. J'ai certainement vu des modifications à un script shell alors qu'il était en cours d'exécution causer des problèmes - l'éviter. Mais cela n'arrive pas toujours et dépend du shell, de la plateforme et peut-être du script. Il pourrait également être affecté par la taille du bloc; le shell peut facilement lire le fichier en blocs, en s'arrêtant quand il n'a plus besoin de lire plus pour le moment. –

+1

@Jonathan: l'affirmation que les scripts shell sont lus dans des blocs cadre avec mon expérience et expliquerait pourquoi le script exécutant a ramassé une version incomplète de mes changements. – Kirby

Répondre

1

No. scripts Shell sont lues soit ligne par ligne, ou d'une commande par commande suivie par ; s, à l'exception des blocs tels que if ... fi blocs qui sont interprétées comme un morceau:

Un script shell est un fichier texte contenant des commandes shell. Lorsqu'un tel fichier est utilisé comme premier argument sans option lors de l'appel de Bash, et ni l'option -c ni -s n'est fournie (voir Invocation de Bash), Bash lit et exécute les commandes à partir du fichier, puis quitte. Ce mode d'opération crée un shell non interactif.

Il est possible de démontrer que les interpréteur attend que le fi d'un bloc if d'exécuter des commandes en les saisissant manuellement sur la ligne de commande.

http://www.gnu.org/software/bash/manual/bashref.html#Executing-Commands

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Scripts

+0

Non, ils sont généralement lus dans des blocs qui dépendent du tampon d'entrée du shell en question, par exemple, 128 octets en une fois. – mirabilos

+0

Bien sûr, ils sont lus en blocs, mais le shell est impératif du haut vers le bas, ce qui signifie qu'il cherche des structures de contrôle pour voir s'il doit continuer. Donc, il peut avoir lu les prochains '$ BUFSIZE' octets du fichier, mais s'il voit un saut de ligne et' exit 255', il va renflouer. Vous avez tous les deux raison. –

0

Il est drôle que la plupart OS'es je sais, ne lisez pas la totalité du contenu de tout script en mémoire et l'exécuter à partir du disque. Faire autrement permettrait de faire des changements au script, en cours d'exécution. Je ne comprends pas pourquoi cela est fait, compte tenu du fait:

  • scripts sont généralement très petites (et ne prennent pas beaucoup de mémoire de toute façon) à un moment donné
  • , et montré dans ce fil, les gens commencer à faire des modifications à un script qui est déjà en cours d'exécution de toute façon

Mais, reconnaissant cela, voici quelque chose à penser: Si vous avez décidé qu'un script ne fonctionne pas OK (parce que vous écrivez/modification/mise au point), faire vous vous souciez du reste de l'exécution de ce script? vous pouvez aller de l'avant en faisant les changements, les sauvegarder, et ignorer toutes les sorties et les actions, effectuées par le cycle en cours. Mais parfois, et cela dépend du script en question, une exécution ultérieure du même script (modifié ou non) peut devenir un problème puisque l'exécution actuelle/précédente exécute une exécution anormale. Il saute typiquement quelques trucs, ou saute subitement sur des parties du script, il ne devrait pas. Et cela peut être un problème. Cela peut laisser les «choses» dans un mauvais état; en particulier si la manipulation/création de fichier est impliquée. Donc, en règle générale: même si le système d'exploitation prend en charge la fonctionnalité ou non, il est préférable de laisser l'exécution en cours se terminer, puis enregistrer le script mis à jour. Vous pouvez le changer déjà, mais ne le sauvegardez pas. Ce n'est pas comme dans les vieux jours de DOS, où vous avez réellement un seul écran devant vous (un écran DOS), donc vous ne pouvez pas dire que vous devez attendre la fin de l'exécution, avant de pouvoir ouvrir un fichier à nouveau.

0

Non, ils ne le sont pas et il y a beaucoup de bonnes raisons à cela. Une des choses que vous devez garder à l'esprit est qu'un interpréteur de commandes n'est pas un interprète même s'il y a des similitudes. Les coquilles sont conçues pour fonctionner avec un flux de commandes. Soit à partir du TTY, d'un PIPE, d'une FIFO ou même d'une socket. Le shell lit sa ligne de ressources par ligne jusqu'à ce qu'un EOF soit renvoyé par le noyau. La plupart des shells ne supportent pas l'interprétation des fichiers. ils travaillent avec un fichier comme ils travailleraient avec un terminal. En fait, cela est considéré comme une fonctionnalité intéressante, car vous pouvez faire des choses intéressantes comme ceci How do Linux binary installers (.bin, .sh) work?

Vous pouvez utiliser un fichier binaire et préfixer des scripts shell. Vous ne pouvez pas faire cela avec un interprète. parce qu'il analyse le fichier entier ou au moins il l'essaye et échoue. Un shell ne ferait qu'interpréter ligne par ligne et ne se soucie pas de la poubelle à la fin du fichier. Vous devez juste vous assurer que l'exécution du script se termine avant qu'il n'atteigne la partie binaire.

Questions connexes