프로세스는 정수 인수로 _exit()
시스템 호출 (Linux의 경우 참조 exit_group()
)을 호출 하여 종료 코드를 상위에보고 할 수 있습니다. 정수이지만 부모는 8 개의 최하위 비트 만 사용할 수 있습니다 ( 리눅스에서는 아니지만 부모에서 SIGCHLD에서 또는 처리기를 사용하여 waitid()
해당 코드를 검색 할 때 제외 ).
부모는 일반적으로 wait()
또는 자녀 waitpid()
의 상태 를 정수로 가져 오거나 ( waitid()
시맨틱이 약간 다른 의미를 가질 수도 있지만)
Linux 및 대부분의 Unices에서 프로세스가 정상적으로 종료되면 해당 상태 번호 의 8에서 15까지 비트에 전달 된 종료 코드가 포함됩니다 exit()
. 그렇지 않으면 7 개의 최하위 비트 (0-6)에 신호 번호가 포함되고 코어가 덤프 된 경우 비트 7이 설정됩니다.
perl
의 $?
가 설정 한 예를 들어 해당 번호를 포함 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과 같은 쉘은 또한 자신의 $?
변수 에서 마지막 실행 명령의 종료 상태를 만듭니다 . 그러나에 의해 반환 된 숫자는 직접 포함하지 않지만 waitpid()
변환은 쉘마다 다릅니다.
프로세스가 정상적으로 종료 된 경우 모든 쉘에서 공통적 $?
인 것은 종료 코드의 가장 낮은 8 비트 (에 전달 된 수 exit()
)를 포함한다는 것입니다.
프로세스가 신호에 의해 종료되는 시점이 다릅니다. 모든 경우에 POSIX에서 요구하는 숫자는 128보다 큽니다. POSIX는 값이 무엇인지 지정하지 않습니다. 실제로, 내가 알고있는 모든 Bourne과 같은 쉘에서 가장 낮은 7 비트 $?
에는 신호 번호가 포함됩니다. 그러나 n
신호 번호는 어디에 있습니까?
ash, zsh, pdksh, bash, Bourne 쉘 $?
은 128 + n
입니다. 무슨 의미하는 것은 당신이 얻을 경우 그 껍질에,이다 $?
의 129
, 당신은 프로세스로 종료 있기 때문에인지 모르는 exit(129)
또는이 신호에 의해 살해되었는지 여부 1
( HUP
대부분의 시스템에서). 그러나 이론적 근거는 쉘이 스스로 종료 될 때 기본적으로 마지막 종료 된 명령의 종료 상태를 반환한다는 것입니다. $?
절대 255보다 크지 않도록 하여 일관된 종료 상태를 유지할 수 있습니다.
$ 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
, $?
이다 256 + n
. 즉, $?
사용자 의 가치에서 종료 프로세스와 종료되지 않은 프로세스를 구별 할 수 있습니다. ksh
종료시 $?
255보다 큰 경우 최신 버전의 에서는 동일한 종료 상태를 상위에보고 할 수 있도록 동일한 신호로 자체를 종료합니다. 그것은 좋은 생각처럼 들리지만 ksh
, 코어 생성 신호에 의해 프로세스가 종료되면 여분의 코어 덤프를 생성합니다 (다른 잠재적으로 다른 것을 덮어 쓸 것).
$ 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.
함수 가 수행 한 ksh93
경우에도 자체 를 죽이는 버그가 있다고 말할 수도 있습니다.$?
return 257
$ 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
타협을 제공합니다. 를 반환합니다 256 + 128 + n
. 즉, 종료 된 프로세스와 올바르게 종료 된 프로세스를 구별 할 수도 있습니다. 그리고 나가면 128 + n
자살하지 않고 부작용을 보고 하지 않습니다.
$ 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
의 값에서 신호를 얻으려면 $?
휴대용 방법을 사용하십시오 kill -l
.
$ /bin/kill 0
Terminated
$ kill -l "$?"
TERM
(이동성을 위해 신호 번호를 사용하지 말고 신호 이름 만 사용해야합니다)
Bourne 이외의 전선에서 :
어쩌면 완전성을 위해, 우리는 언급해야 zsh
'의들 $pipestatus
과 bash
의 $PIPESTATUS
마지막 파이프 라인의 구성 요소의 종료 상태를 포함하는 배열.
또한 쉘 함수 및 소스 파일에 관해서는 기본적으로 함수는 마지막 명령 실행의 종료 상태로 리턴되지만 return
내장 상태로 명시 적으로 리턴 상태를 설정할 수도 있습니다 . 그리고 우리는 여기에 몇 가지 차이점이 있습니다.
bash
및 mksh
(R41 때문에, 회귀 ^ Wchange 명백하게는 의도적으로 도입 ) 8 비트 (양 또는 음) 수를 잘라야한다. 그래서 예를 들어 return 1234
설정합니다 $?
로 210
, return -- -1
설정합니다 $?
255.
zsh
및 pdksh
(및 유도체 이외의 mksh
) 임의의 비트 32 진수 정수 (-2 부호 수 31 2 행 (31) -1) (및 32 비트의 수를 절단).
ash
및 yash
0 내지 2 양의 정수를 허용 (31) -1, 그 중 임의의 수의 오류를 반환.
ksh93
대한이 return 0
하는 return 320
설정 $?
그대로,하지만 다른 용도로, 8 개 비트를 잘라. 이미 언급했듯이 256에서 320 사이의 숫자를 반환하면 ksh
종료시 자체 종료 될 수 있습니다 .
rc
그리고 es
심지어는 목록 아무것도 반환 할 수 있습니다.
또한 일부 포탄도 특수 값을 사용할 수 있습니다 $?
/ $status
와 같은 프로세스의 종료 상태없는 몇 가지 오류 상태보고 127
나 126
에 대한 발견되지 명령 또는 하지 실행 (전래 파일이나 구문 오류가) ...
killall myScript
작품, 따라서 killall 의 반환 (그리고 스크립트가 아닙니다!)은 0입니다.kill -x $$
[x는 신호 번호이며 $$는 일반적으로 쉘에 의해 스크립트의 PID로 확장됩니다 (sh, bash, ...)] 스크립트 내 에서 종료 코어가 무엇인지 테스트하십시오.