İşlemler, _exit()sistem çağrısını (Linux'ta da bakınız exit_group()) ebeveynlerine bir çıkış kodu bildirmek için bir tamsayı argümanıyla çağırabilir . Bir tamsayı olmasına rağmen, ebeveyn için yalnızca en az 8 önemli bit bulunur (bunun istisnası , Linux'ta olmasa da, kodu almak için üstte SIGCHLD kullanırken waitid()veya işleyici olduğunda ).
Ebeveyn genellikle bir tamsayı olarak çocuğunun statüsünü almak için wait()veya waitpid()yapar ( biraz farklı anlambilimiyle de olsa kullanılabilir).waitid()
Linux ve çoğu Unices, işlem normal şekilde sonlandırılırsa, bu durum numarasının 8 ila 15 bitleri , iletildiği gibi çıkış kodunu içerir exit(). Aksi takdirde, en az 7 önemli bit (0 ila 6) sinyal numarasını içerecek ve bir çekirdek dökülmüşse bit 7 ayarlanacaktır.
perlVar $?tarafından belirlenen, örneğin, bu sayı içerir waitpid():
$ perl -e 'system q(kill $$); printf "%04x\n", $?'
000f # killed by signal 15
$ perl -e 'system q(kill -ILL $$); printf "%04x\n", $?'
0084 # killed by signal 4 and core dumped
$ perl -e 'system q(exit $((0xabc))); printf "%04x\n", $?'
bc00 # terminated normally, 0xbc the lowest 8 bits of the status
Bourne benzeri mermiler de son çalıştırma komutunun çıkış durumunu kendi $?değişkenlerinde yapar. Bununla birlikte, doğrudan döndürdüğü sayıyı içermez waitpid(), ancak üzerinde bir dönüşüm içerir ve kabukları arasında farklıdır.
Tüm kabuklar arasında ortak olan , işlem normal şekilde sonlandırıldığı takdirde $?çıkış kodunun en düşük 8 bitini (geçen sayı exit()) içermesidir .
Farklı olduğu yerde işlem bir sinyal ile sonlandırılır. Her durumda ve bu POSIX tarafından isteniyorsa, sayı 128'den büyük olacaktır. POSIX, değerin ne olabileceğini belirtmez. Uygulamada, bildiğim tüm Bourne benzeri mermilerde, en düşük 7 bit $?sinyal numarasını içerecek. Ancak, nsinyal numarası nerede
kül, zsh, pdksh, deneme, Bourne kabuğu, $?bir 128 + n. Bunun anlamı bir alırsanız o kabuklarda, yani $?bir 129, sen süreci ile çıkıldı çünkü öyle olmadığını bilmiyorum exit(129)ya da sinyal tarafından öldürüldüğü olmadığını 1( HUPen sistemlerde). Ancak bunun sebebi, kendiliğinden çıktıklarında kabukların varsayılan olarak en son çıkılan komutun çıkış durumunu döndürmesidir. $?Asla 255'ten büyük olmadığından emin olarak , tutarlı bir çıkış durumuna sahip olmanızı sağlar:
$ bash -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
bash: line 1: 16720 Terminated sh -c "kill \$\$"
8f # 128 + 15
$ bash -c 'sh -c "kill \$\$"; exit'; printf '%x\n' "$?"
bash: line 1: 16726 Terminated sh -c "kill \$\$"
8f # here that 0x8f is from a exit(143) done by bash. Though it's
# not from a killed process, that does tell us that probably
# something was killed by a SIGTERM
ksh93, $?Olduğu 256 + n. Bu, $?sizin değerinizden, öldürülen ve öldürülmeyen bir süreç arasında ayrım yapabileceğiniz anlamına gelir . kshÇıkışta $?255'ten büyük olsaydı daha yeni sürümleri , aynı çıkış durumunu ebeveyne bildirmek için kendisini aynı sinyalle öldürür. Bu iyi bir fikir gibi görünse de, ksheğer süreç bir çekirdek üretme sinyali tarafından öldürüldüyse, ekstra bir çekirdek dökümü (potansiyel olarak diğeri üzerine yazma) oluşturacak demektir:
$ ksh -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
ksh: 16828: Terminated
10f # 256 + 15
$ ksh -c 'sh -c "kill -ILL \$\$"; exit'; printf '%x\n' "$?"
ksh: 16816: Illegal instruction(coredump)
Illegal instruction(coredump)
104 # 256 + 15, ksh did indeed kill itself so as to report the same
# exit status as sh. Older versions of `ksh93` would have returned
# 4 instead.
Bir hatanın olduğunu söyleyebileceğiniz yer , bir işlev tarafından ksh93yapılsa bile kendisini öldüren $?bir return 257şey:
$ ksh -c 'f() { return "$1"; }; f 257; exit'
zsh: hangup ksh -c 'f() { return "$1"; }; f 257; exit'
# ksh kills itself with a SIGHUP so as to report a 257 exit status
# to its parent
yash. yashbir uzlaşma sunar. Döner 256 + 128 + n. Bu, öldürülen bir işlem ile doğru bir şekilde sonlanan bir işlem arasında da farklılaşabileceğimiz anlamına gelir. Çıktıktan sonra, 128 + nkendisini ve sahip olabileceği yan etkileri intihar etmek zorunda kalmadan rapor verecek .
$ yash -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
18f # 256 + 128 + 15
$ yash -c 'sh -c "kill \$\$"; exit'; printf '%x\n' "$?"
8f # that's from a exit(143), yash was not killed
Sinyal değerini almak için $?, taşınabilir yol kullanmaktır kill -l:
$ /bin/kill 0
Terminated
$ kill -l "$?"
TERM
(taşınabilirlik için asla sinyal numaraları kullanmamalısınız, sadece sinyal isimleri kullanmalısınız)
Bourne olmayan cephelerde:
csh/ tcshVe fishdurum olduğunu dışında Bourne kabuğunun aynı $statusyerine $?(Not zshda ayarlar $statusile uyumluluk için csh(ek olarak $?)).
rc: çıkış durumu $statusda var, ancak bir sinyal tarafından öldürüldüğünde, bu değişken bir numara yerine sinyalin adını ( bir çekirdek üretildiyse sigtermveya sigill+coreüretildiyse) içerir, bu da kabuğun iyi tasarımının bir başka kanıtıdır. .
es. çıkış durumu değişken değil. Bunu umursuyorsanız, komutu şu şekilde çalıştırın:
status = <={cmd}
hangi bir sayı sigtermveya sigsegv+corebenzeri döndürecek rc.
Belki şeyiyle biz belirtmeliyim zsh's $pipestatusve bash' ın $PIPESTATUSson boru hattının bileşenlerinin çıkış durumu ihtiva diziler.
Ve ayrıca bütünlük için, kabuk işlevlerine ve kaynak dosyalara gelince, varsayılan işlevler en son komut çalıştırmasının çıkış durumuyla birlikte döner, ancak returnyerleşik olarak açıkça bir dönüş durumu da ayarlayabilir . Ve burada bazı farklılıklar görüyoruz:
bashve mksh( R41'den bu yana, kasıtlı olarak tanıtılan bir Wchange ^ gerilimi ) sayıyı (pozitif veya negatif) 8 bit olarak kısaltacaktır. Yani örneğin return 1234koyacaktır $?için 210, return -- -1ayarlayacaktır $?255.
zshve pdksh(ve dışındaki türevler mksh) işaretli bir 32 bit ondalık tamsayıya izin verir (-2 31 ila 2 31 -1) (ve sayıyı 32 bit olarak kesin).
ashve yash0 ila 2 31 -1 arasındaki herhangi bir pozitif tamsayıya izin verin ve bunun dışındaki herhangi bir sayı için bir hata döndürün.
ksh93için return 0için return 320ayarlanmış $?olduğu gibi, ama başka bir şey için, 8 bite kesecek. Daha önce de belirtildiği gibi, 256 ile 320 arasında bir sayı döndürmenin kshçıkıştan sonra kendini öldürmesine neden olabileceğine dikkat edin .
rcve eshatta listeler bile bir şeyleri iade izin verir.
Ayrıca bazı kabukları da özel değerleri kullanmak unutmayın $?/ $statusgibi bir sürecin çıkış durumu olmayan bazı hata durumlarını bildirmek 127veya 126için bulunmayan komut veya değil çalıştırılabilir (a kaynaklı dosyasında veya sözdizimi hatası) ...
killall myScriptdolayısıyla dönüş çalışmaları, killall ait (ve senaryonun!) 'dir 0. Bir yer verebilirkill -x $$sh çalışır (sinyal numarası olma x [ve $$ genellikle bu komut dosyasının PID kabuk tarafından genişletilmiş, bash, ...)] betiğin içinde ve sonra çıkış çekirdeğinin ne olduğunu test edin.