Bir bash betiğinin sonunda koddan çık


22

Bir bash betiğinin sonundaki çıkış kodunun anlamı konusunda kafam karıştı: 0 çıkış kodunun başarılı bir şekilde bittiği ve daha fazla çıkış kodu numarası olduğu anlamına geldiğini biliyorum (yanılmıyorsam 127)?

Benim sorum şu, bir betiğin sonunda 0 çıkış kodunu görünce, betiğin başarısız olmasına ya da başka bir anlamı olsa bile çıkış kodunu 0 olarak zorluyor mu?


2
Bir komut dosyası ile biterse exit 0, komut dosyasında ne olduğuna bakmaksızın 0 çıkış koduyla çıkar.
Hatclock

@Hatclock neden cevabınızı tam olarak verilmiş bir cevabınızı göndermediniz? bir yorum olarak işaretleyemiyorum ve yanıtlamak için sahte internet puanları aldığınızı sanmıyorum (doğru?) Sadece bir düşünce ... (hızlı cevap için övgüler)
Busted

1
Telefonumda bir tren istasyonundayım, telefonumda fazla yazmayı sevmiyorum. ilkkachu olsa iyi bir cevap var gibi gözüküyor!
Hatclock


2
@Hatclock Hayır, hiç de değil. Bir komut dosyası ile sona ererse exit 0, yalnızca bu son komut çalıştırıldığında 0 koduyla çıkar. exit 0Senaryonun sonundaki tek etki , önceki komuttan durumun yerine 0 döndürmektir.
Gilles 'SO- kötülük'

Yanıtlar:


22

Builtin komutu exitkabuktan çıkar ( Bash'in referansından ):

exit [n]
Kabuktan çıkın, kabuğun ebeveyne n durumu döndürülür. N belirtilmezse, çıkış durumu yürütülen son komutun durumudur. EXIT üzerindeki herhangi bir tuzak, kabuk sona ermeden önce gerçekleştirilir.

Dosyanın sonuna doğru koşmak da son komutun dönüş kodunu döndürerek çıkar, bu yüzden evet, final exit 0komutları önceki komutların çıkış durumundan bağımsız olarak betiğin başarılı bir şekilde çıkmasını sağlar. (Bu, komut dosyasının exitsonuna ulaştığını varsayar .) Bir komut dosyasının sonunda , sıfır kodlu bir çıkış kodu da kullanabilir trueya da kullanabilirsiniz :.

Elbette daha sık exitiçinde içerden bir ifsenaryoyu ortada bitirmek için kullanırdın.

Bunlar 1 $?yazmalıdır ( önceki komutun döndürdüğü çıkış kodunu içerir):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

Bu 0 yazdırması gerekirken:

sh -c "false; exit 0" ; echo $?

Bir komut yürütülürken "başarısız" komutunun bir exitanlam ifade edip etmediğine emin değilim , çünkü bazı komutların başarısız olması için komut dosyası tarafından çalıştırılmış, ancak komut dosyasının kendisi başarılı olabilir. Neyin başarılı ve neyin olamayacağına karar vermek, senaryonun yazarına kalmıştır.

Ayrıca, çıkış kodları için standart aralık 0..255'tir. 127'nin üzerindeki kodlar, bir sinyal tarafından sonlandırılan bir işlemi belirtmek için kabuk tarafından kullanılır, ancak her zamanki şekilde geri döndürülebilirler. waitSistem çağrı aslında işletim sistemi tarafından belirlenen kalan ihtiva eden durum bit ile, daha geniş bir değer verir.


Harika, 8 bitlik çıkış kodlarının numaralandırılmasını bilmiyordum. Teşekkürler!
Busted

Bir işlem öldüğünde,> 127 kodlu bir çıkış koduyla çıkmadığına $?dikkat edin. Bu durumda bazı kabuklar 128 + signum olarak ayarlanmış . İşlem sonlandırıldığında varsayılan çıkış kodu bölümüne bakınız. detaylar için.
Stéphane Chazelas

exit 0Çıkış yapılırsa sadece 0 döndürür. (farklı bir yoldan çıkabilir).
ctrl-alt-delor

18

0 başarı, pozitif tamsayılar başarısızlık anlamına gelir. 255 farklı hata kodu vardır, ancak 126 ve üstü değerler, bir programın başlayamayacağını (126 veya 127) veya bir sinyalle (129 ve üstü) öldürüldüğünü belirtmek için ayrılmıştır. İşlem sonlandırıldığında varsayılan çıkış kodu bölümüne bakınız. ve ben bash fonksiyonları / komut ne dönüş / çıkış değerleri kullanabilir? daha fazla bilgi için.

Bir kabuk betiğinin çıkış durumu, betiğin yürüttüğü son komutun çıkış durumu. Yani

#!/bin/sh
somecommand

bir çıkış durumu ile döner somecommandiken,

#!/bin/sh
somecommand
exit 0

ne somecommanddöndüğüne bakmaksızın 0 döndürür . Bu ikinci senaryo da yazılabilir.

#!/bin/sh
somecommand
true

exit 0Bir betiğin sonuna koymak , mutlaka 0 döndürmesine neden olmaz. Bu, yalnızca betiğin sonuna gelindiğinde 0 değerini döndürmesini sağlar. Örneğin, aşağıdaki komut her zaman 3 döndürür:

#!/bin/sh
exit 3
exit 0

Aşağıdaki komut dosyası, aynı zamanda, bir sözdizimi hatası hakkında bir mesaj göstermenin yanı sıra her zaman bir hata kodu döndürür:

#!/bin/sh
}
exit 0

Aşağıdaki komut ilk bağımsız değişkenine bağlı olarak 1 veya 0 döndürür:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

Aşağıdaki komut dosyası durumunu döndürür somecommand, çünkü başarısız olursa set -ekomut dosyasının çıkmasına neden somecommandolur:

#!/bin/sh
set -e
somecommand
exit 0
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.