2016-06-19 4 views
2

bash는 명령 치환 잘못된 종료 상태를 수신이 예는 떠들썩한 파티와 맥 엘 캐피 테스트되었습니다

main_script.sh :

참고 : func_a 및 func_b이 라인을 제외하고 동일 그 로컬 변수 output이 선언됩니다.

func_a() { 
    local output 
    output="$(./external.sh some_function)" 
    if [ $? -eq 0 ];then 
     echo "A zero result ($?) -> $output <- end" 
    else 
     echo "A other result ($?) -> $output <- end" 
    fi 
} 

func_b() { 
    local output="$(./external.sh some_function)" 
    if [ $? -eq 0 ];then 
     echo "B zero result ($?) -> $output <- end" 
    else 
     echo "B other result ($?) -> $output <- end" 
    fi 
} 

func_a 
func_b 

external.sh :

내가 출력이 main_script 실행
some_function() { 
    echo "this is the output" 
    return 1 
} 

"[email protected]" 

:

A other result (1) -> this is the output <- end 
B zero result (0) -> this is the output <- end 

를 들어 어떤 이유 것 같은 라인 등의 로컬 변수의 선언 명령 대체가 결과에 영향을 줍니까? 이게 버그 일 수 있나요? 아니면 뭔가 빠졌습니까?

+0

이렇게하면 도움이 될 것입니다 : [bash 스크립트를 디버깅하는 방법?] (http://unix.stackexchange.com/q/155551/74329) – Cyrus

+0

bash 스크립트를 디버깅하는 방법과 set -x가하는 일을 잘 알고 있습니다. 나는 단순히 출력을 가능한 한 명확하게하려고 노력했다. 나는 그 문제가 무엇인지를 안다, 왜 나는 그럴까 궁금하다. 무슨 일이 있어도 지역 변수가 0을 반환한다고 선언 한 것 같아. 배시 버그 같아? – arctelix

답변

2

이유는 func_b에서 $? 명령 대체 ($(...))의 성공보다는 내장 명령어 local의 성공을 반영하고 있다는 점이다. 에 관계없이 RHS에 어떤 명령 치환이 여부 실패 여부 - 할당이 올바른 구문 경우

local 내장이 성공합니다.

이 내용은 declareexport 내장형과 유사합니다.

는 간단한 예를 도시한다 : 없음 내장이
포함되지 경우 반대로

declare output="$(false)"; echo $? # -> 0(!) - even though `false` obviously fails. 

- 명령 교체 못한 가 반영는 - 간단한 변수 할당의 경우 $? :

output="$(false)"; echo $? # -> 1(!) - simple assignment; $(...) exit code is reported 

,

동작의 직관 차이 local/declare/export가 내장 매크로보다는 쉘 구문의 일부는 사실에 의해 설명된다. 내장 명령 (내장 명령)으로

는, 그들은 명령처럼 취급되며, 명령은 자신의 자신의 종료 코드를 통해 자신의 성공/실패를 신호 할 것으로 예상된다; 상기 내장 명령의 경우, 구문에 따라 올바른 할당이 성공으로 간주됩니다. 즉, 무언가가 일 수 있습니다. RHS에서 명령 대체가 실패하여 null 문자열이더라도 내장 명령이 할당 될 수 있습니다. 성공했다.

+0

그게 내가 생각한 것. 변수를 선언하는 것이 과제의 성공을 대신한다는 것은 어리석은 일입니다. 하지만 다시 쉘 스크립트 랜드에서 직관적 인 일은 거의 없습니다. – arctelix

+0

@arctelix : 그것은 반 직관적입니다. 나는 왜 그것이 일어 났는지를 잘 설명하는 배경 정보를 추가했다. – mklement0