Sì influenzare, almeno colpire nel mio ambiente, ma in modo molto spiacevole . Vedi questi codici. Primo 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."
Fai
$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh # while 'read' is in effect
$ # Then type "hello."
Nel mio caso, l'output è sempre:
hello hello That's all. That's all.
(Ovviamente è molto meglio automatizzarlo, ma l'esempio sopra è leggibile.)
[modifica] Questo è imprevedibile, quindi pericoloso. La soluzione migliore è , come descritto qui metti tutto tra parentesi graffa e prima della parentesi di chiusura metti "exit" . Leggi bene la risposta collegata per evitare insidie.
[aggiunto] Il comportamento esatto dipende da una nuova riga in più e forse anche dal tuo sapore Unix, filesystem, ecc. Se vuoi semplicemente vedere alcune influenze, aggiungi semplicemente "echo foo/bar" a b.sh prima e/o dopo la riga "leggi".
Prova questo... crea un file chiamato bash-is-odd.sh
:
#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh
Ciò dimostra che bash sta effettivamente interpretando lo script "mentre procedi". In effetti, la modifica di uno script di lunga durata ha risultati imprevedibili, l'inserimento di caratteri casuali ecc. Perché? Poiché bash legge dalla posizione dell'ultimo byte, la modifica sposta la posizione del carattere corrente che viene letto.
Bash è, in una parola, molto, molto pericoloso a causa di questa "caratteristica". svn e rsync
se usati con gli script bash sono particolarmente preoccupanti, perché per impostazione predefinita "uniscono" i risultati ... modificando sul posto. rsync
ha una modalità che risolve questo problema. svn e git no.
Presento una soluzione. Crea un file chiamato /bin/bashx
:
#!/bin/bash
source "$1"
Ora usa #!/bin/bashx
sui tuoi script ed eseguili sempre con bashx
invece di bash
. Questo risolve il problema:puoi tranquillamente rsync
i tuoi script.
Soluzione alternativa (in linea) proposta/testata da @AF7:
{
# your script
}
exit $?
Le parentesi graffe proteggono dalle modifiche e l'uscita protegge dalle aggiunte. Naturalmente, staremmo tutti molto meglio se bash avesse un'opzione, come -w
(intero file), o qualcosa che ha fatto questo.
Suddividi il tuo script in funzioni e ogni volta che una funzione viene chiamata source
da un file separato. Quindi puoi modificare i file in qualsiasi momento e il tuo script in esecuzione rileverà le modifiche la prossima volta che verrà recuperato.
foo() {
source foo.sh
}
foo