Status keluar nol untuk keluar bersih

15

Apakah dapat diterima untuk mengembalikan kode keluar non-nol jika program tersebut berjalan dengan baik? Misalnya, katakan saya memiliki program sederhana yang (hanya) melakukan hal berikut:

Program membutuhkan argumen N. Ini mengembalikan kode keluar dari min (N, 255). Perhatikan bahwa N apa pun valid untuk program.

Program yang lebih realistis mungkin mengembalikan kode yang berbeda untuk menjalankan program yang berhasil menandakan hal yang berbeda. Haruskah program-program ini malah menulis informasi ini ke aliran sebagai gantinya, seperti stdout?

Thomas Eding
sumber

Jawaban:

24

Itu tergantung pada lingkungan, tapi saya akan mengatakan itu gaya yang buruk.

Sistem seperti Unix memiliki konvensi yang kuat bahwa status keluar 0 menunjukkan keberhasilan, dan status keluar non-nol menunjukkan kegagalan. Beberapa, tetapi tidak semua, program membedakan antara berbagai jenis kegagalan dengan kode keluar yang tidak nol; sebagai contohgrep biasanya mengembalikan 0 jika pola ditemukan, 1 jika tidak, dan 2 (atau lebih) jika ada kesalahan seperti file yang hilang.

Konvensi ini cukup sulit ditransfer ke kerang Unix. Misalnya, dalam sh,, bashdan shell mirip Bourne lainnya, ifpernyataan tersebut memperlakukan status keluar 0 sebagai berhasil / benar, dan status keluar bukan nol sebagai kegagalan / salah:

if your-command
then
    echo ok
else
    echo FAILURE
fi

Saya percaya konvensi di bawah MS Windows serupa.

Sekarang tentu saja tidak ada yang menghentikan Anda dari menulis program Anda sendiri yang menggunakan kode keluar yang tidak konvensional, terutama jika tidak ada hal lain yang akan berinteraksi dengannya, tetapi perlu diketahui bahwa Anda melanggar konvensi yang mapan, dan itu bisa kembali dan menggigit Anda nanti .

Cara yang biasa bagi suatu program untuk mengembalikan informasi semacam ini adalah dengan mencetaknya ke stdout:

status = $(your-command)
echo Result is $status
Keith Thompson
sumber
7
+1 untuk menjelaskan konvensi, pendekatan itu akan menghancurkan sebagian besar skrip shell saya jika saya meletakkannya di suatu set -etempat.
Benjamin Bannier
Demikian pula dengan grep, diffmengembalikan 1 ketika perbedaan ditemukan; dan> 1 jika terjadi kesalahan.
7heo.tk
6

Tergantung pada apa yang diharapkan lingkungan Anda.

Favorit saya untuk keanehan, dari Wikipedia :

Dalam OpenVMS, keberhasilan ditunjukkan oleh nilai ganjil dan kegagalan oleh nilai genap. Nilainya adalah integer 32 bit dengan sub-bidang: bit kontrol, nomor fasilitas, nomor pesan, dan tingkat keparahan. Nilai keparahan dibagi antara keberhasilan (Keberhasilan, Informasi) dan kegagalan (Peringatan, Kesalahan, Fatal).

Tagihan
sumber
4

Saya pikir ada preseden jika kode keluar mengembalikan informasi yang bermakna dan relevan kepada penelepon dan definisi keberhasilan tidak benar-benar biner. Preseden yang saya pikirkan adalah robocopy yang mengembalikan berbagai hal tergantung pada apa yang terjadi .

Saya akan menambahkan bahwa kita selalu berakhir dengan debugging karena hal ini - sebagian besar utilitas menganggap kode keluar 0 == sukses jadi takut ketika robocopy mengembalikan 1 karena ia menyalin hal-hal bukan nol karena tidak menyalin barang-barang tetapi tidak melakukannya t mendapatkan kesalahan juga.

Wyatt Barnett
sumber
2

tidak mengembalikan 0 untuk menjalankan yang sukses adalah ide yang buruk, karena dapat menyebabkan kebingungan bagi mereka yang menjalankan program Anda. Bagaimana jika beberapa menjalankan program Anda 100+ kali dengan input yang berbeda dan ingin tahu berapa banyak yang gagal atau berhasil diselesaikan, memiliki nilai keberhasilan tunggal membuat ini jauh lebih mudah untuk menemukan perbedaan daripada memiliki banyak nilai yang berbeda.

Jika Anda memiliki program yang memiliki beberapa jalur pengembalian yang berhasil yang semuanya dapat menandakan hal yang berbeda, saya akan mengatakan bahwa itu adalah tanda bahwa program Anda dirancang dengan buruk.

Ryathal
sumber
2

Saya tahu kasus yang menurut saya bisa diterima. Saya tahu kerangka pengujian yang keluar dengan jumlah total kegagalan pengujian. Jadi, misalnya, jika pelari uji selesai dengan tidak ada tes gagal itu keluar dengan nol. Jika satu tes gagal, meskipun pelari tes itu sendiri berjalan dengan baik, ia keluar dengan satu 1. Jika dua gagal mengembalikan 2, dll. Ini naik hingga 250, yang berarti "250 atau lebih kegagalan pengujian".

Ini menggunakan kode keluar> 250 untuk menandakan keluar abnormal.

Meskipun ini melanggar konvensi, ia bekerja dengan baik dalam praktik.

Bryan Oakley
sumber
3
Saya tidak berpikir ini tidak melanggar konvensi - pengujian berhasil jika tidak ada kesalahan; kode hasil yang bukan nol menunjukkan tes gagal.
Bevan
1
Itu "keluar dengan status kesalahan untuk menunjukkan lebih dari 0 kesalahan" dan sementara itu mungkin melanggar semantik umum yang sama dari status keluar, itu pasti tidak melanggar yang lebih besar "0 OK, apa pun yang lebih besar dari 0 adalah kesalahan" konvensi .
Vatine
2

Ini benar-benar tergantung apa yang Anda coba sampaikan dengan kode. DB2, misalnya mengembalikan 100 jika tidak ada data yang ditemukan, berbagai nilai positif lainnya untuk peringatan, dan nilai negatif untuk kesalahan. Oracle melakukan hal serupa.

Jadi, jika ada negara sukses yang berbeda, mungkin layak menggunakan berbagai nilai pengembalian.

Matthew Flynn
sumber
2

Contoh yang bagus: man sa-update (spamassassin)

KODE KELUAR

  • Kode keluar 0 berarti pembaruan tersedia, dan telah diunduh dan diinstal dengan sukses jika --checkonly tidak ditentukan.
  • Kode keluar 1 berarti tidak ada pembaruan baru yang tersedia.
  • Kode keluar dari 2 berarti ...

Dalam hal ini, keluar 1 hanyalah kode informatif. Namun, jika saya akan menulis kode, saya tidak akan memilih 1 karena itu biasanya kegagalan listrik.

Evert
sumber