Bir komutun / yardımcı programın çıkış kodlarının (ve / veya dönüş kodlarının) ve anlamlarının listesini nasıl alabilirim?


17

Terminal komutlarında başlıkta belirtilenleri yapabileceğim bir yol var mı yoksa kodlara bakmak zorunda mıyım?

Yanıtlar:


15

Belirli bir terminal komutunun çıkış durumunun anlamlarını almak için "reçete" yoktur.

Benim ilk girişimi manpage olacaktır:

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).

İkincisi : Google . Bkz wget örnek olarak.

Üçüncüsü : Kabuğun çıkış durumları, örneğin bash. Bash ve yerleşikleri özel olarak 125'in üzerindeki değerleri kullanabilir. Komut bulunamadı 127, komut çalıştırılamaz 126. Daha fazla bilgi için bkz. Bash çıkış kodları .


evet bazı adam, bilgi, ... sayfaları onları içerir .. ve ben olmayanlarla ilgileniyordum. ..ve bir web araştırmasının her zaman bir seçenek olduğunu biliyorum. .. şimdilik göründüğüm sadece bash çıkış kodları oldu ..
kesin

12

Çıkış kodları, bir programı sonlandırdığınızda bir hata koşulunu belirtir ve 0 ile 255 arasında düşer. Kabuk ve yerleşikleri, özel hata modlarını belirtmek için özellikle 125'in üzerindeki değerleri kullanabilir, bu nedenle kod listesi kabuklar ve işletim sistemleri arasında değişebilir (örn. Bash) çıkış durumu olarak 128 + N değerini kullanır). Bakınız: Bash - 3.7.5 Çıkış Durumu veya man bash.

Genelde sıfır çıkış durumu bir komutun başarılı olduğunu , sıfır dışında bir çıkış durumunun başarısız olduğunu belirtir .

Komut tarafından hangi hata kodunun döndürüldüğünü kontrol etmek $?için, son çıkış kodu için yazdırabilir veya bir kabuk komut dosyası çıktıktan sonra ardışık düzenden (Bash'ta) ${PIPESTATUS[@]}çıkış durumu değerlerinin listesini verir .

Bulunabilecek tüm çıkış kodlarının tam bir listesi yoktur, ancak çekirdek kaynağında çıkış durum numaralarını sistematize etme girişimi olmuştur, ancak bu ana C / C ++ programcıları için amaçlanmıştır ve komut dosyası oluşturma için benzer standart uygun olabilir.

Hem Linux hem de BSD / OS X'te programlar için tercih edilen çıkış kodlarına (64-78) sahip bazı sysexitlerin listesini /usr/include/sysexits.h(veya: BSD'de) bulabilirsiniz man sysexits:

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 */

Yukarıdaki liste daha önce kullanılmayan 64-78 çıkış kodlarını tahsis etmektedir. Ayrılmamış çıkış kodlarının aralığı gelecekte daha da kısıtlanacaktır.

Bununla birlikte, yukarıdaki değerler esas olarak sendmail'de kullanılır ve hemen hemen hiç kimse tarafından kullanılmaz, bu nedenle bir standarda uzaktan yakın bir şey değildir ( @Gilles tarafından işaret edildiği gibi ).

Kabukta çıkış durumu aşağıdaki gibidir (Bash'e göre):

  • 1-125 - Komut başarıyla tamamlanmadı. Durumun anlamı için komutun man sayfasını kontrol edin, aşağıdaki birkaç örnek:

  • 1 - Genel hatalar için catchall

    "Sıfıra böl" ve diğer izin verilmeyen işlemler gibi çeşitli hatalar.

    Misal:

    $ let "var1 = 1/0"; echo $?
    -bash: let: var1 = 1/0: division by 0 (error token is "0")
    1
    
  • 2 - Mermi yapılarının yanlış kullanımı (Bash belgelerine göre)

    Eksik anahtar kelime veya komut veya izin sorunu (ve başarısız bir ikili dosya karşılaştırmasında fark dönüş kodu).

    Misal:

     empty_function() {}
    
  • 6 - Böyle bir cihaz veya adres yok

    Misal:

    $ curl foo; echo $?
    curl: (6) Could not resolve host: foo
    6
    
  • 124 - komut zaman aşımına uğradı

  • 125- bir komutun kendisi başarısız olursa bkz: coreutils
  • 126 - komut bulunur ancak çağrılamazsa (örn. yürütülebilir değil)

    İzin sorunu veya komutu yürütülebilir bir dosya değil.

    Misal:

    $ /dev/null
    $ /etc/hosts; echo $?
    -bash: /etc/hosts: Permission denied
    126
    
  • 127 - bir komut bulunamazsa, yürütmek için oluşturulan alt işlem bu durumu döndürür

    Olası sorun $PATHveya bir yazım hatası.

    Misal:

    $ foo; echo $?
    -bash: foo: command not found
    127
    
  • 128 - için geçersiz argüman exit

    exit yalnızca 0 - 255 aralığında tamsayı değişkenlerini alır.

    Misal:

    $ exit 3.14159
    -bash: exit: 3.14159: numeric argument required
    
  • 128- 254- ölümcül hata sinyali "n" - komut bir sinyal almasından dolayı öldü. Sinyal kodu durumu (Linux:, man 7 signalBSD:) almak için 128'e (128 + SIGNAL) eklenmiştir man signal, aşağıdaki birkaç örnek:

  • 130 - Ctrl-C tuşlarına basıldığı için komut sonlandırıldı, 130-128 = 2 (SIGINT)

    Misal:

    $ cat
    ^C
    $ echo $?
    130
    
  • 137- komut KILL(9)sinyali gönderilirse (128 + 9), aksi takdirde komutun çıkış durumu

    kill -9 $PPID komut dosyası.

  • 141- SIGPIPE- okuyucu olmadan bir boru üzerine yazın

    Misal:

    $ 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 - sinyal kodu 15 ile sonlandırılan komut (128 + 15 = 143)

    Misal:

    $ sleep 5 && killall sleep &
    [1] 19891
    $ sleep 100; echo $?
    Terminated: 15
    143
    
  • 255* - çıkış durumu aralık dışında.

    exit yalnızca 0 - 255 aralığında tamsayı değişkenlerini alır.

    Misal:

    $ sh -c 'exit 3.14159'; echo $?
    sh: line 0: exit: 3.14159: numeric argument required
    255
    

Yukarıdaki tabloya göre, 1 - 2, 126 - 165 ve 255 çıkış kodlarının özel anlamları vardır ve bu nedenle kullanıcı tanımlı çıkış parametreleri için kaçınılmalıdır.

Aralık dışı çıkış değerlerinin beklenmeyen çıkış kodlarına neden olabileceğini lütfen unutmayın (örn. Çıkış 3809, 225, 3809% 256 = 225 çıkış kodunu verir).

Görmek:


errnodeğerleri sistem API'leri tarafından kullanılır, çıkış durumları olarak kullanılmazlar (doğru aralıkta bile değildirler) ve kabuk komut dosyası oluşturma için önemsizdirler. Sysexits değerleri sendmail'den ve hemen hemen hiç kimse tarafından kullanılmıyor, bir standarda uzaktan yakın bir şey değil.
Gilles 'SO- kötü olmayı kes

7

Kodu / belgeleri incelemeniz gerekir. Ancak "standardizasyona" en yakın şey errno.h


başlık dosyasını işaret ettiğiniz için teşekkürler .. birkaç araçların belgelerine bakarak çalıştı .. çıkış kodları bulmak zor zaman, en stderrs olacak gibi görünüyor ...
kesin

3
errno.hçıkış kodları söz konusu olduğunda ilgisizdir, yalnızca hata mesajlarıdır.
Gilles 'SO- kötü olmayı bırak'

Çoğu program, ortaya konulduğu gibi BSD kurallarına göre çıkış kodlarını döndürür sysexits.h. Ancak, bazı programlar errnos döndürür ve aslında errnos döndürmenin en mantıklı olduğunu düşünüyorum . İşlenmeyen errnos Propagate yukarı, istisnalar gibi, ( errnokalır, işlevleri örneğin dönmek -1ya 0|NULL). Programlar sadece işlevler olduğundan, ayrı bir adres alanında çalıştırılan işlevler de olsa, bir programın errnoişlem sınırı boyunca yayılmaya devam etmek isteyebileceği mantıklıdır .
PSkocik

@PSkocik, böyle bir komutun örneği var mı? errnos taşınabilir değildir (değerler sistemlerde tutarlı değildir) ve err adını veya iletisini değerden almanın taşınabilir bir yolu yoktur (zsh bunun için bir yerleşik vardır). Bazı sistemlerin, 123'ün üzerinde, ortak özel anlam hata kodlarıyla çakışacak hatalara sahip olduğundan bahsetmiyoruz . Genellikle, komutlar errno'daki iletileri yazdırır ve bir başarı / başarısızlık çıkış durumu döndürür. komutlar kullanıcılara yöneliktir. fonksiyonlar / sistem çağrıları programcılar içindir.
Stéphane Chazelas

@ StéphaneChazelas Birkaç kez gördüm, ancak iyi kurulmuş programlarda kabul etmem gerekiyor. Ben şahsen oyuncak sistemimde errno + 1'i geri gönderiyorum (böylece 1 "herhangi bir hata" anlamına gelmeye devam ediyor), çünkü program sınırları boyunca errno'ları serileştirmenin BSD kuralına göre çevirmekten daha mantıklı olduğunu düşünüyorum. temelde işlev çağırma ve işlevler errno kullanın. PROMPT_COMMAND (bash) 'da kendi son çıkış durumu kod çözücüyü kullanıyorum "($numeric_code|$bsd_decoded|$errno_plus_one_decoded)".
PSkocik

1

Bildiğim kadarıyla, sadece iki, daha fazla veya daha az standart değer vardır - her ikisi de stdlib.hexit () ile kullanım için tanımlanmıştır :

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

Ve fiili standart değer tek, yani dünyadaki tüm programlar için aynı anlama sahip olan, BAŞARI anlamına gelen 0 (sıfır) 'dır.

Farklı programlar, farklı hataları (farklı türler veya ciddiyet) ayırt etmek veya vurgulamak için döndürülen "başarısızlık" kodlarının farklı listelerini sunar. Bazı programlar, döndürülen değeri, keşfedilen çalışma zamanı hatalarının tam sayısını bildirmek için bile kullanır (örn., Takımdaki başarısız birim testi sayısı).

Ben "yeni standart" her türlü tanıtmak tavsiye etmem stdlib.h

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.