first.sh
:
#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"
second.sh
:
echo "sono nel secondo script"
dosomething1
exit $?
Jika second.sh
mendeteksi kesalahan dan keluar dengan status -9, first.sh
selalu keluar. Bagaimana saya bisa menghindari keluar dari shell pertama jika shell anak keluar?
Saya tidak bisa mengedit second.sh
.
shell
shell-script
exit
pengguna3589887
sumber
sumber
.
perintah, yang sumber file lain di shell saat ini. Tidak ada shell anak atau subkulit yang terlibat. Apakah Anda bermaksud mengeksekusisecond.sh
danthird.sh
bukannya mengambilnya?Jawaban:
Apa yang Anda lakukan di sini termasuk
second.sh
danthird.sh
sebagai sub-skrip yang berjalan dalam proses yang sama, yang disebut "sumber" dalam pemrograman shell.. ./second.sh
pada dasarnya setara dengan memasukkan tekssecond.sh
pada saat itu. Theexit
perintah keluar proses, tidak peduli apakah Anda menyebutnya dalam naskah asli atau naskah bersumber.Jika semua yang ingin Anda lakukan adalah menjalankan perintah
second.sh
danthird.sh
dan mereka tidak perlu mengakses atau memodifikasi variabel dan fungsi dari skrip asli, panggil skrip ini sebagai proses anak.Jika Anda memerlukan skrip lain untuk mengakses variabel dan fungsi dari skrip asli, tetapi tidak memodifikasinya, panggil skrip ini dalam subkulit. Subshell adalah proses yang terpisah, jadi
exit
keluar hanya mereka.Jika Anda perlu menggunakan variabel atau fungsi yang didefinisikan dalam
second.sh
danthird.sh
di skrip induk, maka Anda harus terus sumbernya.The
return
builtin keluar hanya script bersumber dan tidak seluruh proses - itu salah satu dari beberapa perbedaan antara termasuk script lain dengan.
perintah dan termasuk teks dalam naskah tua. Jika skrip bersumber hanya memanggilexit
di tingkat atas, yang bertentangan dengan fungsi di dalam, maka Anda dapat mengubahnyaexit
menjadireturn
. Anda dapat melakukannya tanpa memodifikasi skrip dengan menggunakan alias.Jika
exit
juga disebut fungsi di dalam, saya tidak berpikir ada cara yang tidak rumit. Cara rumit adalah dengan mengatur jebakan keluar dan menempatkan kode Anda di sana.sumber
Alih-alih mencari shell kedua dan ketiga, jalankan saja seperti yang Anda lakukan pada perintah lain. Kode keluar dapat disimpan dan digunakan jika Anda perlu, seperti:
sumber
STATUS1=$?
akan menangkap hasil dari perintah gema yang dikeluarkan sebelumnya, yang independen dari hasil./second.sh
.Cobalah dengan cara ini (hapus dulu
.
saat meneleponsecond.sh
):first.sh
:second.sh
:Ini karena
.
kode pendeksource
yang menyebabkan skrip kedua dimasukkan sebagai bagian dari yang pertama.sumber