프로세스를 백그라운드 설정 $로 보내는 이유는 무엇입니까? 0이 아닌 값인가요? [복사]

프로세스를 백그라운드 설정 $로 보내는 이유는 무엇입니까? 0이 아닌 값인가요? [복사]

방금 포그라운드 프로세스를 백그라운드로 보내면 변수가 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)입니다.127126basesignal numberbase

126, 127 값 또는 129..192 범위의 숫자를 저장 하면 이것이 하위 코드인지, 신호로 인한 코드인지, 오류로 인한 것인지 $?알 수 없습니다 .exit()exec()

$?또한 소수의 신호에만 표준화된 숫자가 부여되므로 숫자는 부분적으로 운영 체제에 따라 다릅니다. SIGTSTP숫자가 지정되지 않은 신호의 경우 $?해당 숫자가 사망 신호에서 나온 것이라고 가정하여 신호 이름을 얻는 방법이 여전히 있습니다.

다음 예를 확인하세요.

$ sleep 100^Z
$ echo $?
152
$ kill -l 152
TSTP

kill -lfrom 값은 현재 운영 체제에서 지정된 신호의 값과 신호 번호에 관계없이 $?모든 쉘에 적용됩니다.POSIXbase

사용자에게 친숙한 쉘(예: )을 사용하는 경우 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에 대한 현재 권장 사항입니다 .$?NOEXECNOTFOUND

내 예제에서는 호환되는 운영 체제 exit()에서만 작동하는 POSIX32비트 코드를 사용합니다. 값은 210표현식의 결과입니다 1234567890 & 0xFF.

관련 정보