테스트 후 마지막 종료 상태를 유지하는 방법

테스트 후 마지막 종료 상태를 유지하는 방법

$?테스트 후 마지막 명령의 종료 상태( )를 변경하지 않고 유지할 수 있나요?

예를 들어 다음을 수행하고 싶습니다.

command -p sudo ...
[ $? -ne 1 ] && exit $?

마지막 항목은 exit $?sudo 종료 상태를 반환해야 하지만 항상 반환됩니다 0(테스트된 종료 코드).

임시 변수 없이 이 작업을 수행할 수 있습니까?

추가 설명을 위한 또 다른 예:

 spd-say "$@"
 [ $? -ne 127 ] && exit $?

127이 경우 첫 번째 명령이 발견되면 종료(종료 코드 != )하고 싶습니다 . 실제 spd-say종료 코드 로 종료하고 싶습니다 (아마도 아님 0).

편집: 더 나은 이식성을 위해 POSIX 호환 솔루션을 선호한다는 사실을 언급하는 것을 잊었습니다.

나는 스크립트에서 이 구성을 사용하고 있으며 동일한 명령에 대한 대안을 제공하고 싶습니다. 예를 들어 내crc32 스크립트.

임시 변수의 문제점은 다른 변수를 숨길 수 있고 긴 이름을 사용하지 않기 위해 코드 가독성에 좋지 않다는 것입니다.

답변1

실제 요구 사항에 따라 추가 오버헤드 없이 종료 상태를 안정적으로 처리할 수 있는 몇 가지 옵션이 있습니다.

변수를 사용하여 종료 상태를 저장할 수 있습니다.

command -p sudo ...
rc=$?
[ "$rc" -ne 1 ] && echo "$rc"

성공 또는 실패를 직접 볼 수 있습니다.

if  command -p sudo ...
then  echo success
else  echo failure
fi

또는 case종료 상태를 구별하기 위해 구문을 사용하십시오.

command -p sudo ...
case $? in
(1) ... ;;
(127) ... ;;
(*) echo $? ;;
esac

질문에서 제기된 특별한 경우:

command -p sudo ...
case $? in (1) :;; (*) echo $?;; esac

이러한 모든 옵션의 장점은 POSIX와 호환된다는 것입니다.

echo(참고: 설명을 쉽게 하기 위해 위 명령을 사용했습니다 . exit요청된 기능과 일치하도록 적절한 명령문으로 바꾸십시오.)

답변2

command -p ...
test 1 -ne $? && exit $_

를 사용하면 $_이전 명령의 마지막 인수로 확장됩니다.

답변3

쉘 함수를 정의하고 사용할 수 있습니다.

check_exit_status()
{
    [ "$1" -ne 1 ] && exit "$1"
}

그 다음에

command -p sudo ...
check_exit_status "$?"

$?틀림없이 이것은 인수 list 를 복제하기 때문에 "속임수"입니다 check_exit_status.

조금 어색해 보일 수도 있지만 그렇습니다. (이런 일은 문제에 임의의 제약을 가할 때 발생합니다.) 융통성이 없어 보일 수도 있지만 그렇지 않습니다. check_exit_status더 복잡해지고 매개변수를 추가하여 종료 상태 값에 대해 수행할 테스트를 알려줄 수 있습니다.

답변4

귀하의 직접적인 질문에 대답하자면, 아니요, $?동일하게 유지하는 것은 불가능합니다. 이것은 당신이 잘못된 질문에 초점을 맞추고 있다고 의심되는 상황 중 하나입니다. 임시 변수는 원하는 효과를 얻기 위한 표준이자 선호되는 방법입니다. 이는 너무 표준적이므로 사용하고 싶지 않다고 생각하는 이유를 포기(또는 재검토)하는 것이 좋습니다. 다른 접근 방식의 추가 복잡성이 그만한 가치가 있는지 의심됩니다.

단순한 호기심으로 묻는다면 대답은 '아니요'입니다.

관련 정보