다음과 같은 스크립트가 있습니다 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 프로세스에 의해 실행되며 $?
프로세스 간에 공유되지 않습니다. judge
bash 함수를 생성하여 이 문제를 해결할 수 있습니다 .
[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 $?