GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada kode status keluar standar di Linux?

'1' :Menangkap semua kesalahan umum

'2' :Penyalahgunaan shell bawaan (menurut dokumentasi Bash)

'126' :Perintah yang dipanggil tidak dapat dijalankan

'127' :"perintah tidak ditemukan"

'128' :Argumen tidak valid untuk keluar

'128+n' :Sinyal kesalahan fatal "n"

'130' :Skrip diakhiri dengan Ctrl + C

'255' :Keluar dari status di luar jangkauan

Ini untuk Bash. Namun, untuk aplikasi lain, ada kode keluar yang berbeda.


Bagian 1:Panduan Pembuatan Skrip Bash Tingkat Lanjut

Seperti biasa, Panduan Pembuatan Skrip Bash Tingkat Lanjut memiliki informasi yang bagus:(Ini ditautkan dalam jawaban lain, tetapi ke URL non-kanonik.)

1: Catchall untuk kesalahan umum
2: Penyalahgunaan builtin shell (menurut dokumentasi Bash)
126: Perintah yang dipanggil tidak dapat dijalankan
127: "perintah tidak ditemukan"
128: Argumen tidak valid untuk keluar
128+n: Sinyal kesalahan fatal "n"
255: Keluar dari status di luar rentang (keluar hanya membutuhkan argumen bilangan bulat dalam rentang 0 - 255)

Bagian 2:sysexits.h

Referensi ABSG sysexits.h .

Di Linux:

$ find /usr -name sysexits.h
/usr/include/sysexits.h
$ cat /usr/include/sysexits.h

/*
 * Copyright (c) 1987, 1993
 *  The Regents of the University of California.  All rights reserved.

 (A whole bunch of text left out.)

#define EX_OK           0       /* successful termination */
#define EX__BASE        64      /* base value for error messages */
#define EX_USAGE        64      /* command line usage error */
#define EX_DATAERR      65      /* data format error */
#define EX_NOINPUT      66      /* cannot open input */    
#define EX_NOUSER       67      /* addressee unknown */    
#define EX_NOHOST       68      /* host name unknown */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_OSERR        71      /* system error (e.g., can't fork) */
#define EX_OSFILE       72      /* critical OS file missing */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76      /* remote error in protocol */
#define EX_NOPERM       77      /* permission denied */
#define EX_CONFIG       78      /* configuration error */

#define EX__MAX 78      /* maximum listed value */

8 bit dari kode kembalian dan 8 bit dari jumlah sinyal pembunuhan dicampur menjadi satu nilai pada kembalian dari wait(2) &co..

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

int main() {
    int status;

    pid_t child = fork();
    if (child <= 0)
        exit(42);
    waitpid(child, &status, 0);
    if (WIFEXITED(status))
        printf("first child exited with %u\n", WEXITSTATUS(status));
    /* prints: "first child exited with 42" */

    child = fork();
    if (child <= 0)
        kill(getpid(), SIGSEGV);
    waitpid(child, &status, 0);
    if (WIFSIGNALED(status))
        printf("second child died with %u\n", WTERMSIG(status));
    /* prints: "second child died with 11" */
}

Bagaimana Anda menentukan status keluar? Biasanya, shell hanya menyimpan kode pengembalian 8-bit, tetapi menetapkan bit tinggi jika proses dihentikan secara tidak normal.

$ sh -c 'exit 42'; echo $?
42
$ sh -c 'kill -SEGV $$'; echo $?
Segmentation fault
139
$ expr 139 - 128
11

Jika Anda melihat sesuatu selain ini, program mungkin memiliki SIGSEGV penangan sinyal yang kemudian memanggil exit normal, sehingga tidak benar-benar terbunuh oleh sinyal. (Program dapat memilih untuk menangani sinyal apa pun selain SIGKILL dan SIGSTOP .)


Tidak ada jawaban lama yang menjelaskan status keluar 2 dengan benar. Bertentangan dengan apa yang mereka klaim, status 2 adalah apa yang sebenarnya dikembalikan oleh utilitas baris perintah Anda saat dipanggil dengan tidak benar. (Ya, sebuah jawaban bisa berusia sembilan tahun, memiliki ratusan suara positif, dan tetap salah.)

Inilah konvensi status keluar yang sebenarnya dan sudah lama ada untuk penghentian normal, yaitu bukan dengan sinyal:

  • Keluar dari status 0:sukses
  • Status keluar 1:"kegagalan", seperti yang didefinisikan oleh program
  • Keluar dari status 2:kesalahan penggunaan baris perintah

Misalnya, diff mengembalikan 0 jika file yang dibandingkan identik, dan 1 jika berbeda. Berdasarkan konvensi lama, program unix mengembalikan exit status 2 saat dipanggil secara tidak benar (opsi tidak diketahui, jumlah argumen salah, dll.) Misalnya, diff -N , grep -Y atau diff a b c semuanya akan menghasilkan $? disetel ke 2. Ini adalah dan telah menjadi praktik sejak awal Unix di tahun 1970-an.

Jawaban yang diterima menjelaskan apa yang terjadi saat perintah diakhiri oleh sinyal. Singkatnya, penghentian karena sinyal yang tidak tertangkap menghasilkan status keluar 128+[<signal number> . Misalnya, penghentian oleh SIGINT (sinyal 2) menghasilkan status keluar 130.

Catatan

  1. Beberapa jawaban mendefinisikan status keluar 2 sebagai "Penyalahgunaan bawaan bash". Ini hanya berlaku saat bash (atau skrip bash) keluar dengan status 2. Anggap ini sebagai kasus khusus kesalahan penggunaan yang salah.

  2. Di sysexits.h , disebutkan dalam jawaban paling populer, exit status EX_USAGE ("kesalahan penggunaan baris perintah") didefinisikan sebagai 64. Namun ini tidak mencerminkan kenyataan:Saya tidak mengetahui apa pun utilitas Unix umum yang mengembalikan 64 pada pemanggilan yang salah (contoh selamat datang). Membaca kode sumber dengan cermat mengungkapkan bahwa sysexits.h adalah aspiratif, bukan cerminan dari penggunaan sebenarnya:

     *    This include file attempts to categorize possible error
     *    exit statuses for system programs, notably delivermail
     *    and the Berkeley network.
    
     *    Error numbers begin at EX__BASE [64] to reduce the possibility of 
     *    clashing with oth­er exit statuses that random programs may 
     *    already return. 
    

    Dengan kata lain, definisi ini tidak mencerminkan praktik umum pada saat itu (1993) tetapi sengaja tidak sesuai dengannya. Lebih disayangkan.


Linux
  1. Apakah ada STDCALL di Linux?

  2. Apakah ada API C untuk mengekstrak nama file dasar dari jalur lengkapnya di Linux?

  3. Mengapa begitu banyak /dev/tty di Linux?

  1. Linux – Apakah Ada Gui Untuk Linux yang Tidak Menggunakan X11?

  2. Apakah ada distribusi Linux modern yang masih mendukung /dev/audio?

  3. Apakah ada cara untuk memblokir LD_PRELOAD dan LD_LIBRARY_PATH di Linux?

  1. Bisakah Grep Mengembalikan Benar/Salah Atau Apakah Ada Metode Alternatif?

  2. Linux – Bagaimana Cara Mengetahui Jika Ada File Dalam Folder Dan Keluar Dengan Sesuai (dalam Ksh)?

  3. Apa itu Kode Keluar Bash di Linux