Bagaimana cara saya mendapatkan daftar kode keluar (dan / atau kode pengembalian) dan artinya untuk perintah / utilitas?

17

Apakah ada cara saya bisa melakukan apa yang dinyatakan dalam judul dari perintah terminal, atau apakah saya harus melihat ke dalam kode?

tepat
sumber

Jawaban:

15

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 .

kekacauan
sumber
ya beberapa orang, info, ... halaman memasukkan mereka .. dan saya khawatir dengan mereka yang tidak. ..dan saya tahu riset web selalu menjadi pilihan. ..sebagai saat ini tampaknya itu hanya kode keluar bash yang harus saya cari ..
tepat
12

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 sysexitsdi 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: coreutils
  • 126 - 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 $PATHatau 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:

kenorb
sumber
errnonilai-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.
Gilles 'SO- stop being evil'
7

Anda harus melihat ke dalam kode / dokumentasi. Namun hal yang paling dekat dengan "standardisasi" adalah errno.h

Thorsten Staerk
sumber
terima kasih telah menunjukkan file header .. mencoba melihat ke dalam dokumentasi beberapa utils .. kesulitan menemukan kode keluar, sepertinya sebagian besar akan menjadi stderrs ...
tepatnya
3
errno.htidak relevan ketika datang untuk keluar dari kode, hanya pesan kesalahan.
Gilles 'SANGAT berhenti menjadi jahat'
Sebagian besar program mengembalikan kode keluar sesuai dengan konvensi BSD, sebagaimana tercantum dalam sysexits.h. Namun, beberapa program mengembalikan errno, dan saya benar-benar berpikir pengembalian errnoadalah yang paling masuk akal. Unhandled errnos menyebar ke atas, seperti pengecualian, ( errnotetap, fungsi mengembalikan misalnya, -1atau 0|NULL). Karena program hanya fungsi, meskipun fungsi yang dijalankan dalam ruang alamat yang terpisah, masuk akal bahwa program mungkin ingin melanjutkan errnopropagasi melintasi batas proses.
PSkocik
@ PSkik, apakah Anda memiliki contoh perintah seperti itu? errnos tidak portabel (nilai tidak konsisten di seluruh sistem), dan tidak ada cara portabel untuk mendapatkan nama atau pesan err dari nilai (zsh memiliki builtin untuk itu). Belum lagi bahwa beberapa sistem memiliki kesalahan di atas 123 yang akan berbenturan dengan kode kesalahan makna khusus yang umum . Biasanya, perintah mencetak pesan dari errno dan mengembalikan status keluar sukses / gagal. perintah ditujukan untuk pengguna. fungsi / panggilan sistem ditujukan untuk para programmer.
Stéphane Chazelas
@ StéphaneChazelas Saya sudah melihatnya beberapa kali, tetapi tidak dalam program yang sudah mapan, saya harus akui. Saya secara pribadi telah mengembalikan errno +1 di sistem mainan saya belakangan ini (sehingga saya terus mengartikan "kesalahan") karena saya pikir membuat serialisasi errno melintasi batas proses lebih masuk akal daripada menerjemahkan sesuai dengan konvensi BSD, karena eksekusi program dilakukan pada dasarnya fungsi doa, dan fungsi menggunakan errno. Saya menggunakan dekoder status keluar terakhir saya sendiri di PROMPT_COMMAND (bash) saya jadi saya mendapatkan sesuatu seperti "($numeric_code|$bsd_decoded|$errno_plus_one_decoded)".
PSkocik
1

Sejauh yang saya tahu, hanya ada dua, lebih atau kurang, nilai standar - keduanya didefinisikan stdlib.huntuk digunakan dengan exit ():

  • EXIT_SUCCESS (= 0)
  • EXIT_FAILURE (= 1)

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

xoiss
sumber