su -m $USER -c " 외부에서 종료 코드에 액세스"

su -m $USER -c " 외부에서 종료 코드에 액세스"

아래 명령은 $?를 넣었기 때문에 실패 여부에 따라 "0" 또는 "1"을 올바르게 인쇄합니다. "su" 명령 내부.

sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"

그러나 내가 이렇게 하면:

sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?

명령 부분이 실패하더라도 실제 "su"는 항상 성공하기 때문에 항상 "0"을 인쇄합니다.

서브셸의 종료 코드를 어떻게 검색할 수 있는지 아시나요?

답변1

방금 거의 똑같은 상황을 해결했습니다. 그것이 여전히 당신에게 도움이 되기를 바랍니다. 그렇지 않다면 아마도 다른 사람들에게도 도움이 될 것입니다. 저는 sudo가 아닌 su에서 시작했지만 sudo는 다른 명령 하나를 래핑하기 위한 것이므로 su의 종료 코드를 실제로 전달해야 합니다. 그렇지 않은 경우 sudo 수준에서도 아래 수정 사항을 적용할 수 있습니다.

언급했듯이 주요 문제는 명령을 성공적으로 실행한다는 것입니다. 그런 다음 기본 작업은 문제 없이 완료되었음을 보고하여 종료 코드 0을 반환하는 것입니다. 명령에서 0이 아닌 종료 코드가 예상치 못한 것이었는지 또는 이에 대해 뭔가를 수행해야 하는지를 "알지" 못합니다. 따라서 해결책은 su가 마지막 명령의 종료 코드를 반환하도록 만드는 것입니다. 이게 나한테 딱 맞았어

su <user_x> -c '<bunch_of_commands>; exit $?'

sudo가 제대로 작동하지 않는 경우 전체 명령은 다음과 같아야 합니다. (이 내용을 확인해 드리고 싶지만 sudo가 설치되어 있지 않습니다.)

sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'

따옴표 중첩을 관찰하고 $? 확장되지 않으므로 큰따옴표가 없습니다.

답변2

명령 내부에서 반환 값을 에코하고 전체 명령을 변수에 할당하여(하위 쉘을 사용하여) 외부에서 액세스합니다.

RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?")
echo $RETVAL

답변3

언제든지 tmp 파일을 사용할 수 있습니다.

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code

답변4

이는 Zsh/Bash/Bourne 쉘에서 작동합니다.

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"
$ echo $?

한 줄로 요청할 때 반환 코드를 사용할 수 없는 이유가 확실하지 않지만 동일한 작업을 수행하기 위해 두 줄 이상을 사용할 때 사용할 수 있습니다.

관련 정보