Kami menjalankan skrip script1
dari skrip script_main
script_main
:
#!/bin/bash
/tmp/script1
echo $?
sleep 2
echo script ended
script1
:
#!/bin/bash
exit 1
Seperti yang sudah jelas, script1
keluar dengan kode keluar 1
tetapi skrip utama akan berlanjut hingga akhir.
Pertanyaan saya:apakah mungkin ketika script1
apakah exit 1
, lalu juga main_script
akan segera dihentikan?
Jawaban yang Diterima:
Cara paling mudah adalah dengan secara eksplisit memiliki skrip exit
pertama secara eksplisit jika skrip lainnya gagal. Letakkan eksekusi skrip dalam kondisi, seperti
otherscript.sh || exit 1
atau
if ! otherscript.sh ; then
ret=$?
echo "otherscript failed with exit code $ret. exit." >&2
exit 1
fi
Ini akan memungkinkan skrip utama untuk melakukan pembersihan apa pun yang diinginkan, atau hanya mencoba beberapa solusi lain, mungkin tergantung pada apa kode keluar anak itu. Yang pertama, kita bisa menggunakan || exit
, untuk meneruskan kode keluar anak.
Jika Anda ingin skrip utama keluar saat apa saja perintah itu dimulai gagal, lalu set -e
.
set -e
otherscript.sh
echo "this will not run if otherscript fails"
set -e
tidak berlaku untuk program yang berjalan di dalam konstruksi bersyarat sehingga kami masih dapat menguji kode tertentu atau membuntutinya dengan || true
untuk mengabaikan kegagalan. Tapi dengan titik keluar di mana-mana sekarang, kita bisa menggunakan trap somecmd EXIT
untuk melakukan pembersihan sebelum shell keluar, di mana pun itu terjadi.
Memiliki skrip bagian dalam memaksa skrip utama untuk keluar juga dimungkinkan, tetapi sedikit tidak ramah, Anda tidak akan mengharapkan aplikasi biasa melakukannya. Tapi, jika Anda mau, hanya dengan membuat skrip lama yang polos, proses induknya adalah salah satu caranya:
$ 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
Di sini, jika Anda menjalankan otherscript.sh
dari shell interaktif, ia akan mencoba memotret sesi interaktif. Semua shell yang saya uji tampaknya mengabaikan SIGTERM
dalam hal ini ketika berjalan secara interaktif. Bagaimanapun, cangkang utama dapat kembali trap
SIGTERM
.
Alih-alih memotret hanya proses induk, Anda dapat menggunakan kill 0
untuk mematikan semua proses dalam grup proses otherscript.sh
berjalan masuk. Jika dimulai dari shell noninteraktif, biasanya akan menyertakan induknya.