Es tut auf mein Umfeld wirken, zumindest prügeln, aber auf sehr unangenehme Weise . Siehe diese Codes. Zuerst 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."
Tun
$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh # while 'read' is in effect
$ # Then type "hello."
In meinem Fall ist die Ausgabe immer:
hello hello That's all. That's all.
(Natürlich ist es viel besser, es zu automatisieren, aber das obige Beispiel ist lesbar.)
[Bearbeiten] Das ist unvorhersehbar, also gefährlich. Die beste Problemumgehung ist , wie hier beschrieben alle in geschweiften Klammern setzen und vor der schließenden geschweiften Klammer "exit" setzen . Lesen Sie die verlinkte Antwort gut durch Fallstricke zu vermeiden.
[hinzugefügt] Das genaue Verhalten hängt von einem zusätzlichen Zeilenumbruch ab und vielleicht auch von Ihrem Unix-Geschmack, Dateisystem usw. Wenn Sie einfach einige Einflüsse sehen möchten, fügen Sie einfach "echo foo/bar" zu b.sh davor und/oder danach hinzu die "read"-Zeile.
Probieren Sie Folgendes aus ... erstellen Sie eine Datei mit dem Namen bash-is-odd.sh
:
#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh
Das zeigt, dass bash das Skript tatsächlich "as you go" interpretiert. In der Tat führt die Bearbeitung eines lange laufenden Skripts zu unvorhersehbaren Ergebnissen, das Einfügen zufälliger Zeichen usw. Warum? Da bash von der letzten Byte-Position liest, verschiebt die Bearbeitung die Position des aktuell gelesenen Zeichens.
Bash ist, mit einem Wort, wegen dieses "Features" sehr, sehr unsicher. svn und rsync
Wenn sie mit Bash-Skripten verwendet werden, sind sie besonders beunruhigend, da sie standardmäßig die Ergebnisse "zusammenführen" ... Bearbeitung an Ort und Stelle. rsync
hat einen Modus, der dies behebt. svn und git nicht.
Ich stelle eine Lösung vor. Erstellen Sie eine Datei namens /bin/bashx
:
#!/bin/bash
source "$1"
Verwenden Sie jetzt #!/bin/bashx
auf Ihren Skripten und führen Sie sie immer mit bashx
aus statt bash
. Dies behebt das Problem - Sie können getrost rsync
Ihre Skripte.
Alternative (inline) Lösung vorgeschlagen/getestet von @AF7:
{
# your script
}
exit $?
Geschweifte Klammern schützen vor Bearbeitungen und exit schützt vor Anhängen. Natürlich wären wir alle viel besser dran, wenn bash eine Option wie -w
enthalten würde (ganze Datei) oder etwas, das dies getan hat.
Teilen Sie Ihr Skript in Funktionen auf, und jedes Mal, wenn eine Funktion Sie source
nennt es aus einer separaten Datei. Dann können Sie die Dateien jederzeit bearbeiten und Ihr laufendes Skript übernimmt die Änderungen, wenn es das nächste Mal bezogen wird.
foo() {
source foo.sh
}
foo