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.