2016-11-04 9 views
0

"set -e"를 사용하여 오류가 발생했을 때 스크립트를 종료하지만 함수 내에 오류가있는 경우 종료하지 않으려면 함수가 오류를 반환하도록 하시겠습니까?bash : 오류가 발생했을 때 반환 할 함수를 만드는 플래그가 있습니까?

예를 들어

:

#!/bin/bash 
set -e 

func() { 
    echo 1 
    # code ... 
    cause_error 
    echo This should not print 
} 
func 
if [ $? -ne 0 ]; then 
    echo I want this print 
else 
    echo This should not print either 
fi 

이 스크립트의 출력은 다음과 같습니다

$ /tmp/test.sh 
1 

그러나 나는 그것이 싶습니다 :

1 
I want this print 

이것이 가능합니까? 아니면 함수 내에서 실행되는 모든 명령의 종료 상태를 테스트해야합니까?

+0

일반적으로'set -e'를 사용하지 마십시오. 당신 자신의 에러 처리를해라. http://mywiki.wooledge.org/BashFAQ/105 – chepner

답변

0

이 작업을 수행 할 수 있습니다

set -e 

function foo() { 
    echo Foo 
    cause_error 
} 

echo Before 
set +o errexit; foo; set -o errexit; 
echo Will get here 
foo 
echo Wont get here 
+0

왜 + o errexit ... 설정하지 마세요 + e –

+0

설정 + e가 없습니까? –

+0

네, + e도 있습니다. 그것은 동일합니다. – spinkus

0

당신이 요구하는 동작은 불가능합니다. set -e 옵션을 사용하여 함수가 오류로 돌아오고 스크립트가 종료되지 않게하려고합니다. bash 인터프리터에게 요구하는 요구 사항은 각 행의 종료 상태를 점검하고 함수 내에있는 경우 0이 아닌 코드를 리턴하고 else를 종료합니다.

당신이 요구하는 정확한 요구 사항을 수행 할 수 없습니다. 그러나 함수 실행을 위해 set -e을 비활성화 할 수 있습니다. set -e을 해제하는 방법은 예를 들어 업데이트 된 코드는 && : 트릭을 사용 set +e 옵션을 사용하거나 && : 트릭 여기

을 사용하는 것입니다

#!/bin/bash 
set -e 

func() { 
    echo 1 
    # code ... 
    return 1 
    echo This should not print 
} 
func && : 
if [ $? -ne 0 ]; then 
    echo I want this print 
else 
    echo This should not print either 
fi 

출력 :

1 
I want this print 

제공 : 명시 적으로 https://stackoverflow.com/a/27793459/2032943

+0

고마워요.함수 호출에서'out = $ (func && :); echo "$ out"')을 추가하려고 시도했지만 문제는'echo this should print'를 실행한다는 것인데, 함수는 오류 직후에 반환하지 않습니다. –

+0

코드로 질문을 업데이트했습니다 .. –

+0

함수에서 반환 된 값이 bash의 종료 상태가됩니다. –

0

비교하여 $?은 반 패턴이지만 광고에서 dition을 제거하는 것은 set -e을 우회 할 수 있습니다. 왜냐하면 장애가 발생했을 때 실패하지 않기 때문입니다. 당신이 산문에서 말하는 것처럼

에 관계없이 set -e의, 무엇을하려고에 대한 올바른 구문은

if func; then 
    echo I want this print 
else 
    echo This should not print either 
fi 

, 오류를보고하는 기능을하게됩니다 기능 내부의 실패 귀하의 요구 사항에 대한 설명이 있지만 이는 조건부로 This should not print either을 인쇄한다는 것을 의미합니다. 원하지 않으시면이 역설적 인 요구 사항을 명확히하기 위해 질문을 편집하십시오.

+0

고맙지 만, 당신의 솔루션은'This should print either' (이것이 맞을 것이다)를 인쇄하지는 않지만'This should print is not'라고 출력한다. 질문에서 언급했듯이 오류가 발생했을 때 함수가 돌아 오기를 원하므로'echo this should not print' 행을 실행해서는 안됩니다. –

+0

내 잘못 했어요.이 대답을 지우고 싶지만 나 당분간 여기에 처마. 귀하의 우려를 해소하는 이전 질문을 찾을 수 있다면, 나는 이것을 중복으로 표시 할 것입니다. – tripleee

관련 문제