GNU/Linux >> Znalost Linux >  >> Linux

Bash + Jak opustit sekundární skript a hlavní skript v obou případech?

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.

Související:Jak načasovat několik procesů na pozadí?
Linux
  1. Jak ladit Bash skript?

  2. Účel .bashrc a jak to funguje?

  3. Bash skript k odstranění nejstaršího souboru ze složky?

  1. Jak zastavit skript Loop Bash v terminálu?

  2. Nedaří se vám získat správný výstupní kód ze skriptu?

  3. Jak zjistit, zda jsem v relaci Tmux ze skriptu Bash?

  1. Jak synchronizovat datum a čas z příkazového řádku v Ubuntu

  2. Proměnná ve skriptu Bash, která si zachovává hodnotu z posledního spuštění

  3. Jak napsat bash skript nebo automatizovat otevření vi a upravit dokument?