$를 어떻게 사용하나요? 기능을 확인하기 위해 테스트하시겠습니까?

$를 어떻게 사용하나요? 기능을 확인하기 위해 테스트하시겠습니까?
    #!/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

관련 정보