0 çıkışının anlamı, 1 çıkışından ve 2 çıkışından bash betiğinde


49

Bazı pratik alıştırmaları yapıyorum.

Argüman olarak bir ay numarası verilecek ve bu sayıyı bir ay adına çevirecek bir senaryo yazın. Sonuç stdout'a yazdırılacaktır.

Bir çözüm yaptım:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

Ne anlama geliyor exit 1, exit 0ve ne exit 2anlama geliyor?


5
Başarılı bir şekilde yürütülen kod, 0 koduyla çıkmalıdır. Diğer değerler bir hata olduğunu gösterir. Örnek için bkz. Özel Anlamlara Sahip Çıkış Kodları
V. Olsen

2
Bir bash betiği sinemaya benziyor, farklı varlıklar var. Exit deyimleri bash tercümanı için çıkışların konumunu işaretler. Senaryo kovulduğunda, yorumlayıcının en yakın çıkışa kadar çalışması gerekir.
DepressedDaniel

5
Yazdığınız kod buysa, neden anlamadığınız ifadeler kullandınız?
Dmitry Grigoryev

5
1) Soruyu gönderdikten hemen sonra bir cevabı kabul ettiniz . Daha iyi cevaplar için beklemek için 24 saat verin. 2) Kabul edilen cevap yanlış ve yanıltıcıdır. Doğru cevap "çıkış kodları için varsayılan bir anlamı yoktur (0'dan fazla başarı =; senarist geliştiricisi olarak sen semantiği tanımla"). 3) Bu betiği yaptıysanız, neden çıkış komutlarını eklediniz (hepsi mantıklı olarak gereksiz ya da if-else kullandığınızdan beri "exit 1" e daraltılabilir).
Saat

Yanıtlar:


58

İşte kabuk çıkış kodları için iyi bir referans :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Uyarı: Doğru çıkış kodunun kullanılması bir zorunluluk değildir ve kabuk tarafından zorlanmaz. Geliştiriciler, akıllıca olduğunu düşünüyorlarsa rehberliği görmezden gelebilirler.


8
Yine de dikkatli ol. Bir çıkış kodunun ne anlama geldiği tamamen program geliştiricilere bağlıdır.
muru

Ayrıca, bağlantılı kaynak olan Gelişmiş Bash Komut Dosyası Kılavuzu, “ Ayrılmış Çıkış Kodları” (orijinaline vurgu) gösterdiğini iddia ederken, bu iddia hem alıntı hem de tamamen yanlıştır .
Eliah Kagan

23

exitVe bir sayı kullanmak , betiğinizin sonucunu bildirmenin kullanışlı bir yoludur. Bash komutlarının bir dönüş kodu çıktı yolunu taklit eder. Bash komutlarıyla, dönüş kodu 0 genellikle her şeyin hatasız olarak başarıyla yürütüldüğü anlamına gelir. exitAyrıca betiğinizin bu noktada yürütülmesini durdurmasını ve komut satırına geri dönmesini sağlar.

0'dan büyük herhangi bir dönüş kodu, bir tür hata olduğunu gösterir, ancak bazen hata kritik değildir, her komut için, her dönüş kodunun ne anlama geldiğini söyleyen bazı belgeler bulmak mümkün olmalıdır.

Son bash komutunun dönüş kodunu aşağıdaki $?gibi kabuk değişkenini kullanarak alabilirsiniz :

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

Bunu bir komut dosyasında kullandığınızda, dönüş kodunu yürütme işlemi bittiğinde aynı şekilde sorgulayabilirsiniz. Yani göreceksiniz ki:

exit 2
exit 0

Asla ulaşamayacağın gibi bir anlam ifade etmiyor exit 0.


3

Tek başına, exitsıfır çıkış değeri veya komut dosyanızın başarıyla tamamlandığını gösterir. Başarılı bir şekilde tamamlandığını belirtmek için zero argümanını exit komutuna eklemeniz gerekmez. Komut dosyanız hatalı bir durum için test etmesine rağmen başarıyla çıkabilir (veya muhtemelen çıkacaktır). Bu durumda, özellikle hata (veya 1) koşuluyla çıkmasını istiyorsunuz.

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

exitSon satırında komut hiç orada olmak zorunda değildir. Sıfır ile çağrılabilir veya hiç çağrılmayabilir. Exit komutuna 1 argümanı belirtilmeden, tüm bu durumlarda cevabı echo $?sıfır olacaktır.

Ancak exit komutuna 1 argümanı belirterek, cevap echo $?1 olur. Bu nedenle, komut dosyasının bir hata koşulu ile çıktığını belirtmek istediğinizde exit komutuna 1 argümanını kullanın.

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.