Çıkış komutunun çıkış kodunu yakalama


10

Ben bir bash betiği var:

exit 3;

exit_code="$?"

if [[ "$exit_code" != "0" ]]; then
    echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
    exit "$exit_code";
fi

Çıkış komutundan hemen sonra çıkacak gibi görünüyor, bu da mantıklı. Ben hemen çıkmadan bir çıkış kodu sağlayabilir bazı basit komut olduğunu merak ediyordum?

Tahmin edecektim:

exec exit 3

ancak bir hata mesajı verir: exec: exit: not found. Ne yapabilirim? :)


1
Evet exec exit 3bueno değil, anladım"exec: exit: not found"

7
Soruyu anlamıyorum. Neden ayarlanmamış exit_code=3ve ortadan exit 3tamamen çizgiyi?
wjandrea

@wjandrea pratik olmaktan ziyade kavramsal bir soru

2
Benim için hala bir anlam ifade etmiyor. Aslında çıkmazsanız neden bir çıkış kodu olur?
Barmar

1
@Barmar her işlemin bir çıkış kodu vardır. Soruyu cevaplamak için çalışan insanların çoğu "bu ayarlar yüzden senaryodaki ile 'exit 3' yerine ne demek soruyu yorumlama vardır $?değişken ama çıkmamalı bu senaryoyu"?
icarus

Yanıtlar:


32

Bir program çalıştıran ve programın çıkış durumuna (ile $?) bakan bir komut dosyanız varsa ve  bilinen bir değere (örn. ) Ayarlanmasına neden olan bir  şey yaparak bu komut dosyasını test etmek istiyorsanız ,$?3

(exit 3)

Parantezler bir alt kabuk oluşturur. Ardından exitkomut, alt kabuğun belirtilen çıkış durumuyla çıkmasına neden olur.


Ayrıca, hata ayıklama amacıyla exit_code="3", test için ayarlanması da basittir
Centimane

1
Evet, wjandrea bunu dün gösterdi.
G-Man, '

12

exityerleşik bir bash, bu yüzden yapamazsınız exec. Başına bash kılavuzunda :

Bash'in çıkış durumu, kodda yürütülen son komutun çıkış durumudur. Hiçbir komut yürütülmezse, çıkış durumu 0 olur.

Tüm bunları bir araya getirerek, tek seçeneğinizin istediğiniz çıkış durumunu bir değişkene ve sonra exit $MY_EXIT_STATUSuygun olduğunda saklamak olduğunu söyleyebilirim .


hmmm @ G-man's idea hakkında ne düşünüyorsun?

2
Belki ne yapmaya çalıştığınızı yanlış anladım. Sadece ayarlamaya çalışıyorsanız $?(neden yapacağınızdan emin değilim), bu sağlam bir cevap gibi görünüyor. Sadece başarısız bir değere ayarlamak istiyorsanız false, başka bir seçenektir.
solarshado

10

Bağımsız değişken olarak verilen durumu döndüren bir işlev yazabilir veya belirtilmemişse yazabilirsiniz 255. (Ben retdeğerini "döndürür" diyorum .)

ret() { return "${1:-255}"; }

ve retçağrınızın yerine kullanın exit. Bu, şu anda kabul edilen cevapta alt kabuk oluşturma yetersizliğini önler.

Bazı ölçümler.

time bash -c 'for i in {1..10000} ; do (exit 3) ; done ; echo $?'

makinemde yaklaşık 3,5 saniye sürüyor.

 time bash -c 'ret(){ return $1 ; } ; for i in {1..10000} ; do ret 3 ; done ; echo $?'

makinemde yaklaşık 0.051 saniye, 70 kat daha hızlı. Varsayılan işleme koymak hala 60 kat daha hızlı bırakır. Açıkçası döngü biraz yükü var. Döngünün gövdesini sadece olarak değiştirirsem :veya truezaman 0.025 olarak yarıya düşerse, tamamen boş bir döngü geçersiz sözdizimidir. ;:Döngü eklemek , bu minimum komutun 0.007 saniye sürdüğünü gösterir, bu nedenle döngü yükü yaklaşık 0.018'dir. Bu yükü iki testten çıkarmak, retçözeltinin 100 kat daha hızlı olduğunu gösterir.

Açıkçası bu sentetik bir ölçümdür, ancak işler toplanır. Her şeyi olması gerekenden 100 kat daha yavaş yaparsanız, yavaş sistemlerle sonuçlanırsınız. 0.0


2
@iBug Ek alan gerekmez.
icarus

Alt kabuğu yaratmanın verimsizliği hakkında iyi bir nokta. Bazı mermilerin bu gibi durumlarda çatalı optimize edecek kadar akıllı olabileceğini okudum, ama bu bash onlardan biri değil.
G-Man, '

3

Hakkında exec exit 3... adlı harici bir komutu çalıştırmayı dener exit, ancak bir tane yoktur, bu yüzden hatayı alırsınız. Kabukta yerleşik olan yerine harici bir komut olmalıdır, çünkü kabuğun tamamen exec yerini alır . Ayrıca, size denilen bir dış komutu olsaydı bile araçlar exit, exec exit 3çünkü sizin shell script devam dönmek olmaz kabuk artık olmaz .


1
Sanırım yapabilirdin exec bash -c "exit 3", ama şu anda bunu yapmak yerine herhangi bir sebep düşünemiyorum exit 3.
David Z

1
@DavidZ, her halükarda, soruyu istediği gibi görünmeyen senaryoyu ' execya da sadece exit' durduracaktır.
ilkkachu

3

Bunu Awk ile yapabilirsiniz:

awk 'BEGIN{exit 9}'

Veya Sed:

sed Q9 /proc/stat

... veya bir kabuk ile:sh -c 'exit 9'
ilkkachu

1
@ilkkachu bunu yapacaksan (exit 9)kabul edilen cevapta da yapabilirsin
Steven Penny
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.