2014-11-26 2 views
-1

Perl 스타일의 "또는 죽어라"있는 Bash 함수가 있습니다. 예를 들어,명령 대체를 호출하지 않고 어떻게 Bash 함수를 호출 할 수 있습니까?

#!/bin/bash 
func1() { 
    local val 
    val=`cat foobar` || exit 7 
    echo "func1: cat returns $?" 
} 

myval=`func1` 
echo "Line X should not be reached (retn = $? val = $myval)" 
myval=$(func1) 
echo "Line Y should not be reached (retn = $? val = $myval)" 
func1 
echo "Line Z should not be reached (retn = $?)" 

호출 기능은 직접의 나를 exit을 활용할 수 있습니다. 그러나이 함수가 원하는 값을 반환하면 명령 대체는 exit과 함께 작동하지 않습니다. 즉, 출구는 반환 값 $?에 저장되고 다음 행이 실행됩니다.

디버그 옵션을 사용하여 실행하는 경우 -x은 bash가 더 중첩 된 결과를 출력하기 때문에 명령 대체가 subshell과 유사하다는 것을 의미하는 것으로 보입니다. 따라서 exit은 주 스크립트에 적용되지 않습니다.

샘플 출력 : 여전히 단락 exit을 활용하면서

cat: foobar: No such file or directory 
Line X should not be reached (retn = 7 val =) 
cat: foobar: No such file or directory 
Line Y should not be reached (retn = 7 val =) 
cat: foobar: No such file or directory 

는 FUNC1을 호출하고 그 출력을 사용하는 방법 (루프 변수에 등등 경우) 있는가?

+1

짧은 대답을 원하는대로 완벽하게 작동 포함 : 아니요,이 두 가지를 한 번에 수행 할 수 없습니다. –

+1

exit 대신'return 1 '을 사용하십시오. –

+0

명령 대체는 서브 쉘과 유사하지 않습니다. 명시 적으로 주어진 명령을 수행 할 서브 쉘을 작성합니다. – chepner

답변

0

당신은 SIGHUP 신호 처리기와 간단한 코드를 사용할 수 있습니다은 당신이 :)

hndlHUP() { 
    exit 7 
} 
func1() { 
    local val 
    val=$(cat foobar) || kill -SIGHUP $$ 
    echo "func1: cat returns $?" 
} 

trap hndlHUP SIGHUP 

myval=`func1` 
echo "Line X should not be reached (retn = $? val = $myval)" 
myval=$(func1) 
echo "Line Y should not be reached (retn = $? val = $myval)" 
func1 
echo "Line Z should not be reached (retn = $?)"