bash가 $를 설정하는 이유는 무엇입니까? (종료 상태)가 Ctrl-C 또는 Ctrl-Z에서 0이 아닙니까?

bash가 $를 설정하는 이유는 무엇입니까? (종료 상태)가 Ctrl-C 또는 Ctrl-Z에서 0이 아닙니까?

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 ();
  }

그리고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} 변수를 참조하세요.

관련 정보