Saya memilikinya di skrip bash:
exit 3;
exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
exit "$exit_code";
fi
Sepertinya akan keluar tepat setelah perintah keluar, yang masuk akal. Saya bertanya-tanya apakah ada beberapa perintah sederhana yang dapat memberikan kode keluar tanpa keluar segera?
Saya akan menebak:
exec exit 3
namun memberikan pesan kesalahan: exec: exit: not found
. Apa yang dapat saya? :)
bash
shell-script
exec
exit
exit-status
G-Man Mengatakan 'Reinstate Monica'
sumber
sumber
exec exit 3
bukan bueno, saya dapatkan"exec: exit: not found"
exit_code=3
dan menghilangkanexit 3
garis sama sekali?$?
variabel tetapi tidak keluar dari skrip ini "?Jawaban:
Jika Anda memiliki skrip yang menjalankan beberapa program dan melihat status keluar program (dengan
$?
), dan Anda ingin menguji skrip itu dengan melakukan sesuatu yang menyebabkan$?
disetel ke nilai yang diketahui (misalnya,3
), lakukan sajaTanda kurung membuat sub-shell. Kemudian
exit
perintah menyebabkan sub-shell untuk keluar dengan status keluar yang ditentukan.sumber
exit_code="3"
pengujian akanexit
adalah bash built-in, jadi Anda tidak bisaexec
melakukannya. Manual per bash :Menyatukan semua ini, saya katakan satu-satunya pilihan Anda adalah menyimpan status keluar yang Anda inginkan dalam sebuah variabel dan kemudian
exit $MY_EXIT_STATUS
jika perlu.sumber
$?
(walaupun saya tidak begitu yakin mengapa Anda mau), itu sepertinya jawaban yang solid. Jika Anda hanya ingin mengaturnya ke beberapa nilai yang gagal,false
adalah pilihan lain.Anda dapat menulis fungsi yang mengembalikan status yang diberikan sebagai argumen, atau
255
jika tidak ada yang diberikan. (Saya menyebutnyaret
sebagai "mengembalikan" nilainya.)dan gunakan
ret
di tempat panggilan Anda keexit
. Ini menghindari ketidakefisienan membuat sub-shell dalam jawaban yang saat ini diterima.Beberapa pengukuran.
pada komputer saya membutuhkan sekitar 3,5 detik.
pada komputer saya membutuhkan waktu sekitar 0,051 detik, 70 kali lebih cepat. Menempatkan penanganan standar masih menyisakan 60 kali lebih cepat. Jelas loop memiliki beberapa overhead. Jika saya mengubah tubuh loop menjadi hanya
:
atautrue
kemudian waktunya dibagi dua menjadi 0,025, loop yang benar-benar kosong adalah sintaks yang tidak valid. Menambahkan;:
ke loop menunjukkan bahwa perintah minimal ini memakan waktu 0,007 detik, sehingga overhead loop adalah sekitar 0,018. Mengurangi overhead ini dari dua tes menunjukkan bahwaret
solusinya lebih dari 100 kali lebih cepat.Jelas ini adalah pengukuran sintetis, tetapi banyak hal bertambah. Jika Anda membuat semuanya 100 kali lebih lambat dari yang seharusnya, maka Anda akan mendapatkan sistem yang lambat. 0,0
sumber
Tentang
exec exit 3
... itu akan mencoba menjalankan perintah eksternal yang disebutexit
, tetapi tidak ada, sehingga Anda mendapatkan kesalahan. Itu harus berupa perintah eksternal alih-alih yang ada di dalam shell, karenaexec
menggantikan shell sepenuhnya. Yang juga berarti bahwa bahkan jika Anda memiliki perintah eksternal yang dipanggilexit
,exec exit 3
tidak akan kembali untuk melanjutkan skrip shell Anda, karena shell tidak akan ada lagi .sumber
exec bash -c "exit 3"
, tetapi saat ini saya tidak dapat memikirkan alasan untuk melakukan itu sebagai lawan dari adilexit 3
.exec
'ing atau justexit
' ing akan menghentikan skrip, yang sepertinya bukan pertanyaan yang diinginkan.Anda dapat melakukan ini dengan Awk:
Atau Sed:
sumber
sh -c 'exit 9'
(exit 9)
jawaban yang diterima