bash 매뉴얼에서,$?
바꾸다:
$?
가장 최근에 실행된 전경 파이프의 종료 상태로 확장됩니다.
$?
또는 키를 누를 때 bash가 Ctrl-C
변수를 업데이트하는 이유를 알고 싶습니다 Ctrl-Z
.
$ echo $?
0
$ ^C
$ echo $?
130
$ sleep 10
^Z
[1]+ Stopped sleep 10
$ echo $?
148
답변1
명령줄을 누르면 Ctrl+C아무 것도 종료되지 않지만 SIGINT
(에 대한 처리기가 나타납니다.sigint_sighandler()
) 어쨌든 종료 상태를 130으로 설정합니다 (DopeGhoti의 답변에서 설명하는 것처럼 128 + 2).
if (interrupt_immediately)
{
interrupt_immediately = 0;
last_command_exit_value = 128 + sig;
throw_to_top_level ();
}
if (interrupt_state)
{
if (last_command_exit_value < 128)
last_command_exit_value = 128 + SIGINT;
print_newline = 1;
DELINTERRUPT;
}
백그라운드 프로세스 종료를 누르면 Ctrl+C쉘은 프로세스가 종료된 것을 관찰하고 종료 상태를 $?
128에 신호 번호를 더한 값으로 설정합니다.
백그라운드 프로세스를 일시 중지하면 Ctrl+Z쉘은 프로세스에 어떤 일이 발생하는지 관찰합니다. 아직 죽지는 않지만 wait
동일한 시스템 호출(및 친구)을 통해 해당 정보를 보고합니다. 마찬가지로 쉘은 종료 상태를 $?
128에 신호 번호 148(SIGTSTP = 20)을 더하여 설정합니다.
답변2
0
정상적인 종료 상태의 종료 코드이기 때문입니다 .
인터럽트나 인터럽트 신호를 가로채는 것은 정상적인 종료 상태가 아니며 백그라운드로 일시 중단되지도 않습니다. 0이 아닌 종료 코드는 오류가 아닌 상태로 일반적인 방법으로 종료하는 대신 스크립트에 의해 트리거된 작업이 종료되거나 중단될 때 스크립트에서 적절하게 대응할 수 있도록 무슨 일이 일어나고 있는지 알려줍니다.
대화형 셸 세션에서 을 누르면 신호(신호 2) ^C가 발생하여 SIGINT
현재 대화형 명령 항목이 중단됩니다. 이는 명령 항목(예: 명령 프롬프트)의 비정상적인 상태입니다. 그러면 상태 130(128+2)이 반환되고 새 프롬프트가 표시됩니다.
자세한 내용은 다음을 참조하세요.http://tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF.
답변3
$?
표준에는 수신된 신호의 값이 이라고 명시되어 있지만 > 128
이를 수행하는 방법은 표준에 나와 있지 않습니다.
Bourne Shell이 신호를 설정 하는 경우 $?
다음을 사용합니다.128 + signal number
ksh93 사용256 + signal number
신호 1, 2, 3, 6, 9, 14, 15만 이식 가능합니다.
즉, SIGTSTP 및 SIGSTOP은 이식할 수 없는 번호를 사용합니다.
이를 위해 Bourne Shell은 최근 새로운 휴대용 시스템을 출시했습니다.http://schillix.sourceforge.net/man/man1/bosh.1.html${.sh.termsig} 변수를 참조하세요.