İş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.
perl
Var $?
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, n
sinyal 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
( HUP
en 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, ksh
eğ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 ksh93
yapı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
. yash
bir 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 + n
kendisini 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
/ tcsh
Ve fish
durum olduğunu dışında Bourne kabuğunun aynı $status
yerine $?
(Not zsh
da ayarlar $status
ile uyumluluk için csh
(ek olarak $?
)).
rc
: çıkış durumu $status
da var, ancak bir sinyal tarafından öldürüldüğünde, bu değişken bir numara yerine sinyalin adını ( bir çekirdek üretildiyse sigterm
veya 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ı sigterm
veya sigsegv+core
benzeri döndürecek rc
.
Belki şeyiyle biz belirtmeliyim zsh
's $pipestatus
ve bash
' ın $PIPESTATUS
son 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 return
yerleşik olarak açıkça bir dönüş durumu da ayarlayabilir . Ve burada bazı farklılıklar görüyoruz:
bash
ve 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 1234
koyacaktır $?
için 210
, return -- -1
ayarlayacaktır $?
255.
zsh
ve 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).
ash
ve yash
0 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.
ksh93
için return 0
için return 320
ayarlanmış $?
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 .
rc
ve es
hatta listeler bile bir şeyleri iade izin verir.
Ayrıca bazı kabukları da özel değerleri kullanmak unutmayın $?
/ $status
gibi bir sürecin çıkış durumu olmayan bazı hata durumlarını bildirmek 127
veya 126
için bulunmayan komut veya değil çalıştırılabilir (a kaynaklı dosyasında veya sözdizimi hatası) ...
killall myScript
dolayı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.