Arti keluar dari 0, keluar 1 dan keluar 2 dalam skrip bash

49

Saya sedang melakukan beberapa latihan latihan.

Tulis skrip yang akan diberi nomor bulan sebagai argumen dan akan menerjemahkan nomor ini menjadi nama bulan. Hasilnya akan dicetak ke stdout.

Saya membuat solusi:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

Apa exit 1, exit 0dan exit 2berarti, dan mengapa kita menggunakannya?

andrej benedičič
sumber
5
Kode yang berhasil dieksekusi harus keluar dengan kode 0. Nilai lain menunjukkan kesalahan. Lihat misalnya Kode Keluar Dengan Makna Khusus
V. Olsen
2
Script bash seperti bioskop, ada yang berbeda. Pernyataan keluar menandai lokasi pintu keluar untuk penerjemah bash. Ketika skrip dipecat, penerjemah harus menjalankan hingga keluar terdekat.
DepressedDaniel
5
Jika ini adalah kode yang Anda tulis, kenapa Anda menggunakan pernyataan yang bahkan tidak Anda mengerti?
Dmitry Grigoryev
5
1) Anda menerima jawaban yang tepat setelah posting pertanyaan. Berikan 24 jam untuk menunggu jawaban yang lebih baik. 2) Jawaban yang diterima salah dan menyesatkan. Jawaban yang benar adalah "tidak ada arti default untuk kode keluar (di luar 0 = sukses); Anda sebagai pengembang skrip menentukan semantik". 3) Jika Anda membuat skrip itu, mengapa Anda menambahkan perintah keluar (yang semuanya secara logis berlebihan atau bisa runtuh menjadi "keluar 1" karena Anda tetap menggunakan if-else).
AnoE

Jawaban:

58

Inilah satu referensi yang bagus untuk kode keluar shell :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Peringatan: Menggunakan kode keluar yang benar bukanlah persyaratan dan tidak ditegakkan oleh shell. Pengembang dapat mengabaikan panduan jika mereka menganggapnya bijaksana.

pengguna535733
sumber
8
Namun berhati-hatilah. Apa yang dimaksud dengan kode keluar sepenuhnya tergantung pada pengembang program.
muru
Selain itu, sementara sumber tertaut, Panduan Script Bash Lanjutan, mengklaim menunjukkan " Kode Keluar yang Dicadangkan " (penekanan pada aslinya), klaim tersebut tidak dapat disatukan dan sepenuhnya salah .
Eliah Kagan
23

Menggunakan exitdan nomor adalah cara praktis untuk memberi sinyal hasil skrip Anda. Ini meniru cara perintah bash menghasilkan kode kembali. Dengan perintah bash, kode pengembalian 0 biasanya berarti bahwa semuanya dijalankan dengan sukses tanpa kesalahan. exitjuga membuat skrip Anda menghentikan eksekusi pada saat itu dan kembali ke baris perintah.

Setiap kode pengembalian yang lebih besar dari 0 menunjukkan kesalahan semacam, meskipun kadang-kadang kesalahan tidak kritis, untuk setiap perintah itu harus mungkin untuk menemukan beberapa dokumentasi yang memberi tahu Anda apa arti setiap kode kembali.

Anda bisa mendapatkan kode kembali dari perintah bash terakhir dengan menggunakan variabel shell $?seperti:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

Saat Anda menggunakan ini dalam skrip, Anda dapat meminta kode kembali dengan cara yang sama ketika selesai dijalankan. Jadi Anda akan melihat memiliki:

exit 2
exit 0

Agak tidak berarti, karena Anda tidak pernah dapat mencapai exit 0bagian itu.

Arronikal
sumber
3

Dengan sendirinya, exitmenyiratkan nilai keluar nol, atau berhasil menyelesaikan skrip Anda. Anda tidak perlu menambahkan argumen nol ke perintah keluar untuk menunjukkan penyelesaian yang berhasil. Skrip Anda mungkin (atau mungkin akan) keluar dengan sukses walaupun ia menguji kondisi yang salah. Dalam hal ini Anda ingin secara khusus keluar dengan kondisi kesalahan (atau 1).

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

The exitperintah di baris terakhir tidak harus berada di sana sama sekali. Bisa disebut dengan nol atau tidak dipanggil sama sekali. Tanpa menentukan argumen 1 pada perintah keluar, jawaban dalam semua kasus ini echo $?adalah nol.

Namun dengan menentukan argumen 1 pada perintah keluar, respons terhadapnya echo $?adalah 1. Jadi gunakan argumen 1 pada perintah keluar ketika Anda ingin menentukan bahwa skrip telah keluar dengan kondisi kesalahan.

geekasaurus
sumber