GNU/Linux >> Belajar Linux >  >> Linux

Bash + Bagaimana Cara Keluar Dari Skrip Sekunder Dan Dari Skrip Utama Pada Kedua Kalinya?

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.

Terkait:Bagaimana mengatur waktu beberapa proses latar belakang?
Linux
  1. Cara menyinkronkan tanggal dan waktu dari baris perintah di Ubuntu

  2. Bagaimana Cara Men-debug Skrip Bash?

  3. Tujuan .bashrc Dan Bagaimana Cara Kerjanya?

  1. Bagaimana saya tahu nama file skrip dalam skrip Bash?

  2. Variabel dalam Bash Script yang mempertahankan nilainya sejak terakhir kali dijalankan

  3. Skrip Bash untuk menghapus file terlama dari folder

  1. Bagaimana Cara Menangkap Status Pengembalian Dan Menggunakan Tee Pada Saat Yang Sama Di Korn Shell??

  2. Bash Script Untuk Menghapus File Terlama Dari Folder A?

  3. Bagaimana cara menulis skrip bash atau mengotomatiskan vi terbuka dan mengedit dokumen?