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.
9 réponses
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é.)
[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".
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.
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
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.
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.
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?
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!
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.