스크립트가 시작될 때 종료 상태가 항상 0인 이유는 무엇입니까?

스크립트가 시작될 때 종료 상태가 항상 0인 이유는 무엇입니까?

다음과 같은 스크립트가 있습니다 judge.

#!/bin/bash
echo "last exit status is $?"

항상 "마지막 종료 상태가 0이었습니다"를 출력합니다. 예를 들어:

ls -l;   judge # correctly reports 0
ls -z;   judge # incorrectly reports 0
beedogs; judge # incorrectly reports 0

왜?

답변1

각 코드 줄은 서로 다른 bash 프로세스에 의해 실행되며 $?프로세스 간에 공유되지 않습니다. judgebash 함수를 생성하여 이 문제를 해결할 수 있습니다 .

[root@xxx httpd]# type judge
judge is a function
judge ()
{
    echo "last exit status is $?"
}
[root@xxx httpd]# ls -l / >/dev/null 2>&1; judge
last exit status is 0
[root@xxx httpd]# ls -l /doesntExist >/dev/null 2>&1; judge
last exit status is 2
[root@xxx httpd]#

답변2

설명에서 설명한 대로 $? 변수는 셸에 값을 반환한 마지막 프로세스의 값을 보유합니다.

judge이전 명령의 상태에 따라 일부 작업을 수행해야 하는 경우 인수를 수락하고 상태를 전달하도록 할 수 있습니다.

#!/bin/bash
echo "last exit status is $1"
# Or even 
return $1

그래서:

[cmd args...]; judge $?

관련 정보