GNU/Linux >> Linux Esercitazione >  >> Linux

Modifica lo script della shell mentre è in esecuzione

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

Linux
  1. Timeout in uno script di shell?

  2. Comportamento imprevisto di uno script di shell?

  3. Verifica che uno script sia in esecuzione?

  4. Comando Linux per verificare se uno script di shell è in esecuzione o meno

  5. Shell Script while loop:[intorno a una pipeline manca `]'

Su quale shell sto correndo?

Shell Script Wrapper per impedire l'esecuzione di comandi senza argomenti?

Invio di posta HTML utilizzando uno script di shell

Controlla la connettività del database utilizzando lo script Shell

Invio di una mail da uno script della shell Linux

Libreria di output di script di shell colorata