GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bearbeiten Sie das Shell-Skript, während es ausgeführt wird

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

Linux
  1. Zeitüberschreitung in einem Shell-Skript?

  2. Auf welcher Shell laufe ich?

  3. Unerwartetes Verhalten eines Shell-Skripts?

  4. Überprüfen, ob ein Skript ausgeführt wird?

  5. Shell-Skript hängt am Mail-Befehl?

Senden von HTML-Mails mit einem Shell-Skript

Überprüfen Sie die Datenbankkonnektivität mit Shell-Skript

Senden einer E-Mail von einem Linux-Shell-Skript

Farbige Shell-Script-Ausgabebibliothek

Wie füge ich eine neue Zeile in ein Linux-Shell-Skript ein?

Iterieren Sie mithilfe des Shell-Skripts über die $PATH-Variable