Jawaban:
Tidak ada "resep" untuk mendapatkan makna status keluar dari perintah terminal yang diberikan.
Upaya pertama saya adalah halaman manual:
user@host:~# man ls
Exit status:
0 if OK,
1 if minor problems (e.g., cannot access subdirectory),
2 if serious trouble (e.g., cannot access command-line argument).
Kedua : Google . Lihat wget sebagai contoh.
Ketiga : Status keluar dari shell, misalnya bash. Bash dan bawaannya dapat menggunakan nilai di atas 125 khusus. 127 untuk perintah tidak ditemukan, 126 untuk perintah tidak dapat dieksekusi. Untuk informasi lebih lanjut, lihat kode keluar bash .
Kode keluar menunjukkan kondisi kegagalan ketika mengakhiri program dan mereka jatuh antara 0 dan 255. Shell dan bawaannya dapat menggunakan terutama nilai-nilai di atas 125 untuk menunjukkan mode kegagalan tertentu, sehingga daftar kode dapat bervariasi antara shell dan sistem operasi (misalnya Bash menggunakan nilai 128 + N sebagai status keluar). Lihat: Bash - 3.7.5 Status Keluar atau man bash
.
Secara umum status keluar nol menunjukkan bahwa perintah berhasil , status keluar nol menunjukkan kegagalan .
Untuk memeriksa kode kesalahan mana yang dikembalikan oleh perintah, Anda dapat mencetak $?
untuk kode keluar terakhir atau ${PIPESTATUS[@]}
yang memberikan daftar nilai status keluar dari pipa (dalam Bash) setelah skrip shell keluar.
Tidak ada daftar lengkap semua kode keluar yang dapat ditemukan, namun telah ada upaya untuk mensistematisasikan nomor status keluar dalam sumber kernel, tetapi ini dimaksudkan utama untuk programmer C / C ++ dan standar yang sama untuk skrip mungkin tepat.
Beberapa daftar sysexits di Linux dan BSD / OS X dengan kode keluar yang lebih baik untuk program (64-78) dapat ditemukan di /usr/include/sysexits.h
(atau: man sysexits
di BSD):
0 /* successful termination */
64 /* base value for error messages */
64 /* command line usage error */
65 /* data format error */
66 /* cannot open input */
67 /* addressee unknown */
68 /* host name unknown */
69 /* service unavailable */
70 /* internal software error */
71 /* system error (e.g., can't fork) */
72 /* critical OS file missing */
73 /* can't create (user) output file */
74 /* input/output error */
75 /* temp failure; user is invited to retry */
76 /* remote error in protocol */
77 /* permission denied */
78 /* configuration error */
/* maximum listed value */
Daftar di atas mengalokasikan kode keluar yang sebelumnya tidak digunakan dari 64-78. Rentang kode keluar yang tidak dijanjikan akan dibatasi lebih lanjut di masa mendatang.
Namun nilai-nilai di atas terutama digunakan dalam sendmail dan digunakan oleh hampir tidak ada orang lain, sehingga mereka bukan sesuatu yang dekat dengan standar (seperti yang ditunjukkan oleh @Gilles ).
Dalam shell, status keluar adalah sebagai berikut (berdasarkan Bash):
1
- 125
- Perintah tidak berhasil diselesaikan. Periksa halaman manual perintah untuk arti status, beberapa contoh di bawah ini:
1
- Catchall untuk kesalahan umum
Kesalahan lainnya, seperti "bagi dengan nol" dan operasi yang tidak diizinkan lainnya.
Contoh:
$ let "var1 = 1/0"; echo $?
-bash: let: var1 = 1/0: division by 0 (error token is "0")
1
2
- Penyalahgunaan bawaan shell (menurut dokumentasi Bash)
Kata kunci atau perintah tidak ada, atau masalah izin (dan kode pengembalian berbeda pada perbandingan file biner yang gagal).
Contoh:
empty_function() {}
6
- Tidak ada perangkat atau alamat tersebut
Contoh:
$ curl foo; echo $?
curl: (6) Could not resolve host: foo
6
124
- perintah habis
125
- jika perintah itu sendiri gagal lihat: coreutils126
- jika perintah ditemukan tetapi tidak dapat dipanggil (mis. tidak dapat dieksekusi)
Masalah izin atau perintah tidak dapat dieksekusi.
Contoh:
$ /dev/null
$ /etc/hosts; echo $?
-bash: /etc/hosts: Permission denied
126
127
- jika suatu perintah tidak dapat ditemukan, proses anak yang dibuat untuk menjalankannya mengembalikan status itu
Kemungkinan masalah dengan
$PATH
atau salah ketik.
Contoh:
$ foo; echo $?
-bash: foo: command not found
127
128
- Argumen tidak valid untuk exit
exit hanya membutuhkan integer args pada rentang 0 - 255.
Contoh:
$ exit 3.14159
-bash: exit: 3.14159: numeric argument required
128
- 254
- sinyal kesalahan fatal "n" - perintah mati karena menerima sinyal. Kode sinyal ditambahkan ke 128 (128 + SIGNAL) untuk mendapatkan status (Linux man 7 signal
:, BSD:) man signal
, beberapa contoh di bawah ini:
130
- perintah dihentikan karena Ctrl-C sedang ditekan, 130-128 = 2 (SIGINT)
Contoh:
$ cat
^C
$ echo $?
130
137
- jika perintah mengirim KILL(9)
sinyal (128 + 9), status keluar dari perintah sebaliknya
kill -9 $PPID
naskah.
141
- SIGPIPE
- tulis di pipa tanpa pembaca
Contoh:
$ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
$ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
xargs: cat: terminated by signal 13
$ echo ${PIPESTATUS[@]}
0 125 141
143
- perintah diakhiri oleh kode sinyal 15 (128 + 15 = 143)
Contoh:
$ sleep 5 && killall sleep &
[1] 19891
$ sleep 100; echo $?
Terminated: 15
143
255
* - keluar dari status di luar jangkauan.
exit hanya membutuhkan integer args pada rentang 0 - 255.
Contoh:
$ sh -c 'exit 3.14159'; echo $?
sh: line 0: exit: 3.14159: numeric argument required
255
Menurut tabel di atas, kode keluar 1 - 2, 126 - 165, dan 255 memiliki makna khusus, dan karenanya harus dihindari untuk parameter keluar yang ditentukan pengguna.
Harap perhatikan bahwa nilai keluar di luar rentang dapat menghasilkan kode keluar yang tidak terduga (misalnya, keluar 3809 memberikan kode keluar 225, 3809% 256 = 225).
Lihat:
errno
nilai-nilai digunakan oleh sistem API, mereka tidak digunakan sebagai status keluar (mereka bahkan tidak dalam kisaran yang tepat) dan mereka tidak relevan untuk skrip shell. Nilai Sysexits berasal dari sendmail dan digunakan oleh hampir tidak ada orang lain, mereka bukan sesuatu yang dekat dengan standar.
Anda harus melihat ke dalam kode / dokumentasi. Namun hal yang paling dekat dengan "standardisasi" adalah errno.h
errno.h
tidak relevan ketika datang untuk keluar dari kode, hanya pesan kesalahan.
sysexits.h
. Namun, beberapa program mengembalikan errno
, dan saya benar-benar berpikir pengembalian errno
adalah yang paling masuk akal. Unhandled errno
s menyebar ke atas, seperti pengecualian, ( errno
tetap, fungsi mengembalikan misalnya, -1
atau 0|NULL
). Karena program hanya fungsi, meskipun fungsi yang dijalankan dalam ruang alamat yang terpisah, masuk akal bahwa program mungkin ingin melanjutkan errno
propagasi melintasi batas proses.
"($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
.
Sejauh yang saya tahu, hanya ada dua, lebih atau kurang, nilai standar - keduanya didefinisikan stdlib.h
untuk digunakan dengan exit ():
Dan satu-satunya nilai standar de-facto, yaitu, memiliki arti yang sama untuk semua program di dunia, adalah 0 (nol) yang merupakan kependekan dari SUKSES.
Program yang berbeda memperkenalkan daftar kode "kegagalan" yang dikembalikan untuk membedakan atau menekankan kesalahan yang berbeda (tipe atau tingkat keparahan berbeda). Beberapa program bahkan menggunakan nilai yang dikembalikan untuk melaporkan jumlah integer dari kesalahan runtime yang ditemukan (mis., Jumlah unit-tes yang gagal dalam gugatan).
Saya tidak akan merekomendasikan untuk memperkenalkan "standar baru" apa pun yang memperluas stdlib.h