방금 포그라운드 프로세스를 백그라운드로 보내면 변수가 0이 아닌 값으로 Ctrl-Z설정된다는 것을 알았습니다. $?
왜 그럴까요?
명령이 잘못되면 색상이 바뀌는 터미널 프롬프트를 원하기 때문에 이 동작이 나를 귀찮게 합니다. 나는 다음을 수행했습니다.이 답변. 그러나 이는 Vim에서 작업하는 경우 Vim을 배경으로 보낼 때마다 Ctrl-Z마치 뭔가 잘못된 것처럼 프롬프트 색상이 변경된다는 의미이기도 합니다.
답변1
(가설 bash
)
Ctrl-Z는 프로세스를 백그라운드(원래 bg %JOB_NUMBER
)로 보내지 않습니다.정지시키다그것. 이를 위해 SIGSTP 신호가 프로세스로 전송됩니다(직접 수행할 수 있음 kill -SIGSTP PID
). SIGSTP는 신호 20입니다.
표시되는 반환 값은 다음과 같습니다.148 또는 128 + SIGSTP.
따라서 해당 조건을 확인하려면 해당 답변의 코드를 변경해야 하며 항상 148이 됩니다.
답변2
현재 보고 계신 문제는 $?
프로그램 종료 원인을 판별할 수 없는 골동품을 사용하여 정보가 유실되어 발생한 문제입니다.
$?
exit()
프로그램을 찾을 수 없는 경우, 파일을 찾을 수 있지만 실행할 수 없는 경우 또는 + 프로그램이 신호에 의해 종료된 경우 프로그램 코드의 하위 8비트를 포함합니다 . 셸에 따라 달라지는 숫자(보통 128, 256 또는 512)입니다.127
126
base
signal number
base
126, 127 값 또는 129..192 범위의 숫자를 저장 하면 이것이 하위 코드인지, 신호로 인한 코드인지, 오류로 인한 것인지 $?
알 수 없습니다 .exit()
exec()
$?
또한 소수의 신호에만 표준화된 숫자가 부여되므로 숫자는 부분적으로 운영 체제에 따라 다릅니다. SIGTSTP
숫자가 지정되지 않은 신호의 경우 $?
해당 숫자가 사망 신호에서 나온 것이라고 가정하여 신호 이름을 얻는 방법이 여전히 있습니다.
다음 예를 확인하세요.
$ sleep 100^Z
$ echo $?
152
$ kill -l 152
TSTP
kill -l
from 값은 현재 운영 체제에서 지정된 신호의 값과 신호 번호에 관계없이 $?
모든 쉘에 적용됩니다.POSIX
base
사용자에게 친숙한 쉘(예: )을 사용하는 경우 bosh
뿐만 아니라 $?
다음 예를 살펴보십시오.
$ sleep 100^Z
$ echo ${.sh.codename} ${.sh.termsig} ${.sh.status} $/ $?
KILLED TSTP 24 TSTP 152
$ (exit 1234567890)
$ echo ${.sh.codename} ${.sh.termsig} ${.sh.status} $/ $?
EXITED UNKNOWN 1234567890 1234567890 210
${.sh.codename}
목록에 있는 어린이의 사망 원인 이름입니다 EXITED KILLED DUMPED TRAPPED STOPPED CONTINUED NOEXEC NOTFOUND
.
${.sh.termsig}
상태 코드와 관련된 신호 이름입니다.
${.sh.status}
숫자 상태 코드입니다.
위의 세 가지 변수는 bosh
구체적입니다.
$/
프로그램이 정상적으로 종료될 때의 숫자와 신호 또는 또는에 대한 텍스트를 포함하는 후속 프로그램 POSIX
에 대한 현재 권장 사항입니다 .$?
NOEXEC
NOTFOUND
내 예제에서는 호환되는 운영 체제 exit()
에서만 작동하는 POSIX
32비트 코드를 사용합니다. 값은 210
표현식의 결과입니다 1234567890 & 0xFF
.