2014-10-08 8 views
0

bash에서 명령 (gerrit query)을 실행하고이를 변수에 지정하려고합니다. 나는 bash 스크립트 파일 인 &을 사용하고있다. 명령이 오류를 던지면 (예 : gerrit 쿼리가 실패한 경우), 나는 같은 것을 처리 할 수 ​​있어야한다. 나는 $를 사용하여 마지막으로 종료 상태를 확인할 수 있다는 것을 알고Bash 스크립팅에서 명령의 종료 상태는 항상 true입니다.

var=`ssh -p $GERRIT_PORT_NUMBER $GERRIT_SERVER_NAME gerrit query --current-patch-set $PATCHSET_ID` 

: 예를 들어

? bash에서는 위와 같은 경우 변수 할당이 이전 종료 상태 (예 : gerrit 쿼리 실패 상태)를 오버라이드하며 위 명령이 결코 실패하지 않습니다. 항상 사실입니다.

bash의 변수에 할당 된 경우에도 명령의 종료 상태를 처리 할 수있는 방법이 있다면 알려주십시오.

업데이트 : 내 가정이 잘못 여기에 할당 그의 대답에서 종료 상태 찰스 예제와 설명의 최우선을 일으키는 것이 었습니다 올바른지
. 종료 상태가 무시되는 실제 이유는 위 명령의 출력을 종료 상태를 무시하는 범인 인 sed 스크립트로 파이핑했기 때문입니다. 나는이 문제를 해결하는 데 도움이되는 다음을 발견했다. https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/73180#73180Pipe output and capture exit status in Bash

내가 시도한 완전한 명령.

VAR = ssh -p $GERRIT_PORT_NUMBER $GERRIT_SERVER_NAME gerrit query --current-patch-set $PATCHSET_ID | sed 's/message//'

+0

'gerrit'(예 :'/ bin/false' 또는'sh -c "exit 3"')를 사용하지 않는 버그를 재생산 할 수 있습니까? –

+0

"Gerrit 쿼리가 실패 함"이란 정확히 무엇을 의미합니까? 쿼리가 제로 결과를 반환하거나 쿼리 또는 내부 서버 오류에 구문 문제가 있음을 나타냅니다. 나는 전 사건이 오류 조건을 구성하지 않는다고 주장 할 것이다. –

+0

Hey Magnus, GerrIT_SERVER에 연결할 수 없거나 내부 서버 오류가 있거나 GERRIT_PORT 또는 GERRIT_SERVER_NAME이 잘못되었거나 PATCHSET_ID가 유효하지 않은 경우에도 gerrit 쿼리 오류 ('Gerrit 쿼리가 실패 함')가 발생할 수 있습니다. 존재하지 않거나 존재하지 않습니다. – Jose

답변

3

이 질문에 만든 주장은 사실이 아니다; 할당은 종료 상태를 수정하지 않습니다.이 직접 확인할 수 있습니다

var=$(false); echo $? 

은 ... 제대로 1을 방출합니다. 할당이 local, declare 또는 유사한 키워드의 맥락에서 수행되는 경우


말했다 즉, 이것은 더 이상 성립하지 않을 수 :

f() { local var=$(false); echo $?; }; f 

... 0을 방출하며, 할당에서 local을 분리하여 해결할된다

f() { local var; var=$(false); echo $?; }; f 

... 제대로 1을 반환합니다.

ssh localhost false; echo $? 

... 제대로 1를 반환 : 당신이 유사하게 자신을 테스트 할 수 있습니다로


SSH 자체도 제대로 종료 상태를 반환합니다.


합리적인 결론은 다음, 그 자체가 아닌 성공적으로 종료 상태를 전달하기 위해 실패 gerrit 것입니다. 이 버그는 bash 질문이 아닌 gerrit의 지원 메커니즘을 통해 해결되어야합니다.

관련 문제