#!/bin/sh
function checkExit(){
if test "$?" != "0"; then
echo Command $1 exited with abnormal status
exit 1;
else echo $?
fi
}
function echoThenRun () { # echo and then run the command
echo $1
$1
ret=$?
echo $ret
return $ret
}
file=test_file
echo > $file
echoThenRun "test -f $file"
checkExit $file
echo "all right!"
스크립트 실행 결과:
$ ~/Downloads/test.sh
test -f test_file
0
1 # why 1 here??
all right!
답변1
현재 하고 있는 작업을 더 쉽게 수행할 수 있는 방법이 있습니다. set -x
(또는 set -o xtrace
동일한 것을) 사용하면 스크립트는 실행되기 전에 각 줄을 자동으로 에코합니다.
또한 다른 명령을 실행하면 $?
해당 명령의 종료 코드가 대체됩니다.
빠르게 테스트하고 잊어버리는 것 외에 다른 작업을 수행할 계획이라면 변수에 백업해야 합니다. [
실제로 자체 종료 코드가 있는 프로그램입니다 .
set +x
명령을 에코하는 데 사용됩니다.
예를 들어:
(
set -x # Cause commands to echo, but ONLY inside of this (...)
execute some command...
# Any further commands in these parens will also echo.
)
# Command echoing will be OFF at this point because we're outside of the (...).
# Now, $? holds the exit code of the (...) which gets it from the
# exit code of the last command executed inside of it.
result=$?
if [ "$result" -ne 0 ]; then
echo "Your command exited with non-zero status $result"
fi
이것은 stderr에 인쇄됩니다:
+ execute some command...
대안은set +x
set +x
나중에 다음을 사용하여 명령 에코를 비활성화 할 수도 있습니다 .
set -x # Cause commands to echo
execute some command...
result=$?
set +x # Turn off command echoing
그러나 이 접근 방식은 그다지 깨끗하지 않으며 결국 stderr에서 인쇄됩니다.
+ execute some command...
+ result=127
+ set +x
답변2
명령이 로 test "$?" != "0"
설정되는 것 같습니다 .$?
1
이 값은 $?
의 매개변수에 사용됩니다 test
. 는 어휘적으로 동일 하므로 0이 아닌 값으로 test
설정합니다 . 0이 아닌 값을 반환합니다 .$?
"0"
"0"
"!="
test