su -m $ USER -c“<cmd>”외부의 종료 코드에 액세스


8

아래 명령은 실패 여부에 따라 "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"을 인쇄합니다.

서브 쉘의 종료 코드를 어떻게 검색 할 수 있습니까?

답변:


7

나는 거의 똑같은 상황을 고쳤다. 다른 사람들이 아니라면 여전히 도움이되기를 바랍니다. sudo가 아닌 su에서 시작했지만 sudo는 단일 명령을 래핑하기 때문에 su의 종료 코드를 릴레이해야합니다. 그렇지 않은 경우 sudo 레벨에서도 아래 수정 사항을 적용 할 수 있습니다.

언급했듯이 주요 문제는 su가 성공적으로 명령을 실행한다는 것입니다. 기본 조치는 문제없이 완료되었다고보고하여 종료 코드 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

0

항상 tmp 파일을 사용할 수 있습니다 :

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

예, 이것이 내가 지금하고있는 일이지만 tmp 파일에 의존하지 않기를 바랐습니다.
Nick

0

이것은 Zsh / Bash / Bourne 쉘에서 작동합니다 :

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

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


이것은 실제로 올바르지 않습니다. "su -m $ USER -c <cmd>"는 실제 명령이 실패하더라도 항상 성공하기 때문에 항상 0을 반환합니다.
Nick

1
@Nick-여기서 작동합니다. 당신의 출력은 무엇입니까? sudo su -m zero2cx -c "/bin/false &> /dev/null"시스템 사용자 이름으로 시도하십시오 . $?'1'이어야합니다.
zero2cx

예, 내 사용자 이름으로 예상대로 "1"을 반환합니다. 그러나 나는 이것을 사용하여 루트 또는 다른 사용자가 아닌 자체 사용자를 통해 앱을 실행하려고합니다.
Nick

@Nick- $ USER=appusername원하는대로 설정으로 작동해야합니다 . 실제 사용자 이름을 사용하지 말고 의도 한 것을 사용하십시오 appusername. 작동해야합니다.
zero2cx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.