Keluar kode di akhir skrip bash

22

Saya bingung tentang arti kode keluar di akhir skrip bash: Saya tahu kode keluar 0 berarti selesai dengan sukses, dan ada banyak lagi nomor kode keluar (127 jika saya tidak salah?)

Pertanyaan saya adalah ketika melihat kode keluar 0 di akhir skrip, apakah itu memaksa kode keluar sebagai 0 bahkan jika skrip gagal atau apakah itu memiliki arti lain?

Pecah
sumber
2
Jika sebuah skrip berakhir dengan exit 0, itu akan keluar dengan kode keluar 0 terlepas dari apa yang terjadi dalam skrip.
Hatclock
@ Jam, mengapa Anda tidak mengirim jawaban Anda sebagai jawaban yang dijanjikan? sebagai komentar saya tidak bisa menandainya, dan saya tidak berpikir Anda mendapatkan poin internet palsu untuk menjawab (kan?) Hanya pemikiran ... (pujian untuk jawaban cepat)
Busted
1
Saya di stasiun kereta di ponsel saya, saya tidak terlalu suka mengetik di telepon. ilkkachu tampaknya memiliki jawaban yang bagus!
Hatclock
Lihat juga: Kode keluar default saat proses dihentikan?
Stéphane Chazelas
2
@ Jam Tidak, tidak sama sekali. Jika skrip berakhir dengan exit 0, itu akan keluar dengan kode 0 hanya jika instruksi terakhir itu dijalankan. Satu-satunya dampak exit 0pada akhir skrip adalah mengembalikan 0 alih-alih status dari instruksi sebelumnya.
Gilles 'SO- berhenti bersikap jahat'

Jawaban:

22

Perintah builtin exitkeluar dari shell (dari referensi Bash ):

exit [n]
Keluar dari shell, kembalikan status n ke induk shell. Jika n dihilangkan, status keluar adalah dari perintah terakhir yang dijalankan. Jebakan pada EXIT dieksekusi sebelum shell berakhir.

Berlari ke akhir file juga keluar, mengembalikan kode kembali dari perintah terakhir, jadi ya, final exit 0akan membuat skrip keluar dengan status berhasil terlepas dari status keluar dari perintah sebelumnya. (Yaitu, dengan asumsi skrip mencapai final exit.) Di akhir skrip Anda juga bisa menggunakan trueatau :untuk mendapatkan kode keluar nol.

Tentu saja Anda akan lebih sering menggunakan exitdari dalam ifuntuk mengakhiri skrip di tengah.

Ini harus mencetak 1 ( $?berisi kode keluar yang dikembalikan oleh perintah sebelumnya):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

Sementara ini harus mencetak 0:

sh -c "false; exit 0" ; echo $?

Saya tidak yakin apakah konsep skrip "gagal" saat mengeksekusi exitmasuk akal, karena sangat mungkin beberapa perintah yang dijalankan skrip gagal, tetapi skrip itu sendiri berhasil. Terserah penulis naskah untuk memutuskan mana yang sukses dan mana yang tidak.

Juga, rentang standar untuk kode keluar adalah 0..255. Kode di atas 127 digunakan oleh shell untuk menunjukkan proses yang diakhiri oleh sinyal, tetapi mereka dapat dikembalikan dengan cara biasa. The waitsystem call sebenarnya mengembalikan nilai yang lebih luas, dengan sisa yang mengandung Status bit yang ditetapkan oleh sistem operasi.

ilkkachu
sumber
Keren, saya tidak tahu tentang penomoran kode keluar 8 bit. Terima kasih!
Busted
Perhatikan bahwa ketika suatu proses terbunuh, itu tidak keluar dengan kode keluar> 127. Hanya saja beberapa shell diatur $?ke 128 + signum dalam kasus itu. Lihat Kode keluar default saat proses dihentikan? untuk detail.
Stéphane Chazelas
exit 0hanya akan mengembalikan 0, jika jalan keluar dijalankan. (itu bisa keluar dengan rute yang berbeda).
ctrl-alt-delor
18

0 berarti sukses, bilangan bulat positif berarti kegagalan. Ada 255 kode kesalahan yang berbeda, tetapi nilai 126 dan di atas dicadangkan untuk menunjukkan bahwa suatu program tidak dapat memulai (126 atau 127) atau terbunuh oleh sinyal (129 ke atas). Lihat Kode keluar default saat proses dihentikan? dan Nilai pengembalian / keluar apa yang dapat saya gunakan dalam fungsi / skrip bash? untuk informasi lebih lanjut.

Status keluar dari skrip shell adalah status keluar dari perintah terakhir yang dijalankan skrip. Jadi misalnya

#!/bin/sh
somecommand

mengembalikan status keluar somecommand, sedangkan

#!/bin/sh
somecommand
exit 0

mengembalikan 0 terlepas dari apa yang somecommanddikembalikan. Skrip kedua ini juga bisa ditulis

#!/bin/sh
somecommand
true

Menempatkan exit 0di akhir skrip tidak selalu menyebabkannya kembali 0. Ini hanya membuatnya mengembalikan 0 ketika akhir skrip tercapai. Misalnya, skrip berikut selalu menghasilkan 3:

#!/bin/sh
exit 3
exit 0

Skrip berikut juga selalu mengembalikan kode kesalahan, selain menampilkan pesan tentang kesalahan sintaksis:

#!/bin/sh
}
exit 0

Script berikut mengembalikan 1 atau 0 tergantung pada argumen pertamanya:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

Skrip berikut mengembalikan status somecommand, karena set -emenyebabkan skrip keluar jika somecommandgagal:

#!/bin/sh
set -e
somecommand
exit 0
Gilles 'SANGAT berhenti menjadi jahat'
sumber