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

Bash + So beenden Sie beide Male das sekundäre Skript und das Hauptskript

Wir führen das Skript script1 aus aus dem Skript script_main

script_main :

#!/bin/bash
/tmp/script1
echo $?

sleep 2
echo script ended 

script1 :

#!/bin/bash
exit 1

Wie offensichtlich ist, script1 beendet sich mit Exit-Code 1
aber das Hauptskript wird bis zum Ende fortgesetzt.

Meine Frage:ist es möglich, wenn script1 exit 1 , dann auch das main_script wird sofort gestoppt?

Akzeptierte Antwort:

Der einfachste Weg wäre, das erste Skript explizit exit zu haben wenn das andere Skript fehlgeschlagen ist. Setzen Sie die Skriptausführung in eine Bedingung wie

otherscript.sh || exit 1

oder

if ! otherscript.sh ; then
      ret=$?
      echo "otherscript failed with exit code $ret. exit." >&2
      exit 1
fi

Dies würde es dem Hauptskript ermöglichen, jede gewünschte Bereinigung durchzuführen oder einfach eine andere Lösung auszuprobieren, möglicherweise abhängig vom Exit-Code des untergeordneten Elements. Im ersten könnten wir nur || exit , um den Exit-Code des Kindes weiterzugeben.

Wenn Sie möchten, dass das Hauptskript beendet wird, wenn beliebig Befehl, den es startet, schlägt fehl, dann set -e .

set -e
otherscript.sh
echo "this will not run if otherscript fails"

set -e gilt nicht für Programme, die in bedingten Konstrukten ausgeführt werden, sodass wir immer noch auf bestimmte Codes testen oder sie mit || true Misserfolg zu ignorieren. Aber da jetzt überall Austrittspunkte vorhanden sind, könnten wir trap somecmd EXIT verwenden um eine Bereinigung durchzuführen, bevor die Shell beendet wird, unabhängig davon, wo dies geschieht.

Es ist auch möglich, dass das innere Skript das Beenden des Hauptskripts erzwingt, aber ein bisschen unfreundlich, Sie würden nicht erwarten, dass eine gewöhnliche Anwendung dies tut. Aber wenn Sie möchten, ist es eine Möglichkeit, das innere Skript ganz einfach seinen übergeordneten Prozess abschießen zu lassen:

$ cat mainscript.sh
#!/bin/bash
./otherscript.sh
echo "$0 exiting normally"
$ cat otherscript.sh
#!/bin/bash
echo "$0 kill $PPID"
kill $PPID

$ bash mainscript.sh
./otherscript.sh kill 11825
Terminated

Hier, wenn Sie otherscript.sh ausführen von einer interaktiven Shell wird versucht, die interaktive Sitzung aufzunehmen. Alle von mir getesteten Shells scheinen das SIGTERM zu ignorieren in diesem Fall jedoch beim interaktiven Ausführen. In jedem Fall könnte die Haupt-Shell wieder trap das SIGTERM .

Anstatt nur den übergeordneten Prozess abzuschießen, könnten Sie kill 0 verwenden um alle Prozesse in der Prozessgruppe otherscript.sh zu beenden läuft in. Wenn es von einer nicht-interaktiven Shell gestartet wird, würde das normalerweise den Elternteil einschließen.

Verwandte:Wie werden mehrere Hintergrundprozesse zeitlich festgelegt?
Linux
  1. So synchronisieren Sie Datum und Uhrzeit über die Befehlszeile in Ubuntu

  2. Wie debuggt man ein Bash-Skript?

  3. Wie erfasse ich den Rückgabestatus und verwende Tee gleichzeitig in Korn Shell?

  4. Wie kann ich anhand eines Bash-Skripts feststellen, ob ich mich in einer Tmux-Sitzung befinde?

  5. Variable in Bash-Skript, die ihren Wert von der letzten Ausführung beibehält

So erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit in Python

Bash Break:So verlassen Sie eine Schleife

So führen Sie ein Bash-Skript aus

DER EINFACHE WEG, wie man SSH in Bash und WSL2 unter Windows 10 von einem externen Computer aus macht

Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner

Wie sind CPU-Zeit und CPU-Auslastung gleich?