Il fait affecter, au moins frapper dans mon environnement, mais de manière très désagréable . 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.
(Bien sûr, il est préférable de l'automatiser, mais l'exemple ci-dessus est lisible.)
[modifier] C'est imprévisible, donc dangereux. La meilleure solution de contournement est , comme décrit ici mettez tout entre accolades, et avant l'accolade fermante, mettez "exit" . Lisez bien la réponse liée pour éviter les pièges.
[ajouté] Le comportement exact dépend d'une nouvelle ligne supplémentaire, et peut-être aussi de votre saveur Unix, de votre 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éez un fichier appelé bash-is-odd.sh
:
#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh
Cela démontre que bash interprète effectivement le script "au fur et à mesure". En effet, éditer un script de longue durée a des résultats imprévisibles, insérer des caractères aléatoires etc. Pourquoi ? Parce que bash lit à partir de la position du dernier octet, l'édition décale l'emplacement du caractère en cours de lecture.
Bash est, en un mot, très, très dangereux à cause de cette "fonctionnalité". svn et rsync
lorsqu'ils sont utilisés avec des scripts bash, ils sont particulièrement troublants, car par défaut, ils "fusionnent" les résultats... édition en place. rsync
a un mode qui corrige cela. svn et git ne le font pas.
Je présente une solution. Créez un fichier appelé /bin/bashx
:
#!/bin/bash
source "$1"
Utilisez maintenant #!/bin/bashx
sur vos scripts et exécutez-les toujours avec bashx
au lieu de bash
. Cela résout le problème - vous pouvez en toute sécurité rsync
vos scripts.
Solution alternative (en ligne) proposée/testée par @AF7 :
{
# your script
}
exit $?
Les accolades protègent contre les modifications et la sortie protège contre les ajouts. Bien sûr, nous serions tous bien mieux lotis si bash avait une option, comme -w
(fichier entier), ou quelque chose qui a fait ça.
Divisez votre script en fonctions, et chaque fois qu'une fonction est appelée, vous source
à partir d'un fichier séparé. Ensuite, vous pouvez modifier les fichiers à tout moment et votre script en cours d'exécution reprendra les modifications la prochaine fois qu'il sera sourcé.
foo() {
source foo.sh
}
foo