Modifier le script shell pendant qu'il est en cours d'exécution

Pouvez-vous éditer un script shell en cours d'exécution et que ces modifications affectent l'exécution du script?

je suis curieux au sujet du cas particulier d'un script csh que j'ai ce lot exécute un tas de différentes saveurs de construction et exécute toute la nuit. Si quelque chose m'arrive en cours d'opération, j'aimerais y ajouter des commandes supplémentaires, ou commenter celles qui ne sont pas exécutées.

si ce n'est pas possible, y a-t-il un shell ou un mécanisme par lot qui me permettrait de faire cette?

bien sûr, je l'ai essayé, mais il faudra des heures avant que je vois si cela a fonctionné ou non, et je suis curieux de ce qui se passe ou non dans les coulisses.

62
demandé sur ack 2010-08-03 19:49:52

9 réponses

Les Scripts

ne fonctionnent pas de cette façon; l'exécution de la copie est indépendante du fichier source que vous éditez. La prochaine fois que le script est exécuté, il sera basé sur la dernière version enregistrée du fichier source.

il pourrait être sage de décomposer ce script en plusieurs fichiers, et de les exécuter individuellement. Cela réduira le temps d'exécution à l'échec. (c'est-à-dire, diviser le lot en un construire des scripts de saveur, l'exécution de chacun individuellement pour voir ce qui est à l'origine difficulté.)

-41
répondu ford 2010-08-03 15:54:28

[modifier] Voir aussi cette réponse, la section 3 pour des solutions de contournement.

Il ne d'affecter, au moins bash dans mon environnement, mais dans très préjudiciable . Voir ces codes. Premier a.sh :

#!/bin/sh

echo "First echo"
read y

echo "$y"

echo "That's all."

b.sh :

#!/bin/sh

echo "First echo"
read y

echo "Inserted"

echo "$y"

# echo "That's all."

Faire

$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh  # while 'read' is in effect
$ # Then type "hello."

Dans mon cas, la sortie est toujours:

hello
hello
That's all.
That's all.

C'est imprévisible, donc dangereux. Voir cette réponse, section 3 pour les solutions de contournement.

[ajouté] le comportement exact dépend d'une nouvelle ligne supplémentaire, et peut-être aussi de votre saveur Unix, système de fichiers, etc. Si vous voulez simplement voir quelques influences, ajoutez simplement "echo foo/bar" à B. sh avant et / ou après la ligne "lire".

34
répondu teika kazura 2017-05-23 12:10:28

essayez ceci... créer un fichier appelé "bash-is-odd.sh":

#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh

qui démontre que bash interprète bien le script"as you go". En effet, éditer un script de longue durée a des résultats imprévisibles, insérant des caractères aléatoires, etc. Pourquoi? Parce que bash lit à partir de la position du dernier octet, donc éditer change l'emplacement du caractère en cours de lecture.

Bash est, en un mot, très, très dangereux à cause de cela "caractéristique." svn et rsync utilisés avec des scripts bash sont particulièrement troublants, car par défaut ils "fusionnent" les résultats... montage en place. rsync a un mode qui corrige cela. svn et git ne le font pas.

je présente une solution. Créer un fichier appelé "/bin/bashx":

#!/bin/bash
source ""

maintenant utilisez #!/ bin / bashx sur vos scripts et exécutez-les toujours avec "bashx" au lieu de bash. Cela règle le problème - vous pouvez rsync vos scripts en toute sécurité.

solution Alternative (en ligne) proposée/testée par @AF7:

{
   # your script
} 
exit $?

lacets bouclés protéger contre les modifications, et sortie protège contre les accessoires. Bien sûr, nous serions tous beaucoup mieux si bash venait avec une option, comme '-w' (ensemble du fichier), ou quelque chose qui a fait ça.

26
répondu Erik Aronesty 2017-02-14 20:11:51

cassez votre script en fonctions, et chaque fois qu'une fonction est appelée vous source il à partir d'un fichier séparé. Ensuite, vous pouvez éditer les fichiers à tout moment et l'exécution de votre script va chercher les modifications prochaine fois qu'elle sera disponible.

foo() {
  source foo.sh
}
foo
14
répondu glenn jackman 2010-08-03 18:59:03

je n'ai pas de csh installé, mais

#!/bin/sh
echo Waiting...
sleep 60
echo Change didn't happen

exécutez cela, éditez rapidement la dernière ligne pour lire

echo Change happened

sortie est

Waiting...
/home/dave/tmp/change.sh: 4: Syntax error: Unterminated quoted string

Hrmph.

je suppose que les modifications des scripts shell ne prennent pas effet tant qu'ils ne sont pas relancés.

1
répondu dave4420 2010-08-03 15:57:08

si tout cela est dans un seul script, alors non cela ne fonctionnera pas. Cependant, si vous le configurez comme un script pilote appelant des sous-scripts, alors vous pourriez être en mesure de changer un sous-script avant qu'il ne soit appelé, ou avant qu'il ne soit appelé de nouveau si vous êtes en boucle, et dans ce cas, je crois que ces changements seraient reflétés dans l'exécution.

1
répondu Ethan Shepherd 2010-08-03 16:10:00

j'entends Non... mais qu'en est-il indirectement:

BatchRunner.sh

Command1.sh
Command2.sh

Command1.sh

runSomething

Command2.sh

runSomethingElse

alors vous devriez être capable d'éditer le contenu de chaque fichier de commande avant que BatchRunner ne s'y mette correctement?

OR

une version plus propre aurait BatchRunner regarder à un dossier simple où il exécuterait consécutivement une ligne à la fois. Alors vous devriez être capable d'éditer ce second fichier pendant que le premier tourne à droite?

0
répondu ack 2010-08-03 16:05:22

bonne question! Espérons que ce script simple aide

#!/bin/sh
echo "Waiting..."
echo "echo \"Success! Edits to a .sh while it executes do affect the executing script! I added this line to myself during execution\"  " >> "151900920"
sleep 5
echo "When I was run, this was the last line"

Il semble bien sous linux que les modifications apportées à un agent d'exécution .les poissons sont édictées par l'exécution du script, si vous pouvez taper assez vite!

0
répondu Will Turner 2018-09-06 04:24:38

Habituellement, il est rare d'éditer votre script pendant son exécution. Tout ce que vous avez à faire est de mettre en contrôle pour vos opérations. Utilisez les instructions if / else pour vérifier les conditions. Si quelque chose échoue, alors faites ceci, autrement faites cela. C'est le chemin à parcourir.

-5
répondu ghostdog74 2010-08-03 15:57:30