Spustíme skript script1
ze skriptu script_main
script_main
:
#!/bin/bash
/tmp/script1
echo $?
sleep 2
echo script ended
script1
:
#!/bin/bash
exit 1
Jak je zřejmé, script1
ukončí se s kódem ukončení 1
, ale hlavní skript bude pokračovat až do konce.
Moje otázka:je to možné, když script1
exit 1
, pak také main_script
bude okamžitě zastaven?
Přijatá odpověď:
Nejpřímějším způsobem by bylo explicitně mít první skript exit
pokud selhal druhý skript. Spuštění skriptu vložte do podmíněné, jako
otherscript.sh || exit 1
nebo
if ! otherscript.sh ; then
ret=$?
echo "otherscript failed with exit code $ret. exit." >&2
exit 1
fi
To by umožnilo hlavnímu skriptu provést jakékoli čištění, které chce, nebo jen zkusit nějaké jiné řešení, možná v závislosti na tom, jaký byl výstupní kód dítěte. V prvním z nich bychom mohli použít pouze || exit
, abyste předali výstupní kód dítěte.
Pokud chcete, aby hlavní skript skončil, když jakýkoli příkaz, který se spustí, selže, poté set -e
.
set -e
otherscript.sh
echo "this will not run if otherscript fails"
set -e
se nevztahuje na programy, které běží uvnitř podmíněných konstrukcí, takže stále můžeme testovat konkrétní kódy nebo je ohraničit pomocí || true
ignorovat selhání. Ale protože teď jsou výstupní body všude, mohli bychom použít trap somecmd EXIT
provést jakékoli čištění před ukončením shellu, bez ohledu na to, kde k němu dojde.
Je také možné, že vnitřní skript vynutí ukončení hlavního skriptu, ale trochu nepřátelské, nečekali byste, že to udělá běžná aplikace. Ale pokud chcete, jedním ze způsobů je mít vnitřní skript obyčejného starého natáčení jeho nadřazeným procesem:
$ 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
Zde, pokud spustíte otherscript.sh
z interaktivního shellu se pokusí natočit interaktivní relaci. Zdá se, že všechny shelly, které jsem testoval, ignorují SIGTERM
v tomto případě však při interaktivním běhu. V každém případě by hlavní shell mohl opět trap
SIGTERM
.
Místo fotografování pouze rodičovského procesu můžete použít kill 0
zabít všechny procesy ve skupině procesů otherscript.sh
Pokud je spuštěn z neinteraktivního shellu, obvykle by to zahrnovalo rodiče.