[bash] 호출 방법에 관계없이 전체 실행을 중단하는 bash 함수를 작성하는 방법이 있습니까?

전체 스크립트를 종료하기 위해 bash 함수에서 “exit 1″문을 사용했는데 제대로 작동했습니다.

function func()
{
   echo "Goodbye"
   exit 1
}
echo "Function call will abort"
func
echo "This will never be printed"

그러나 다음과 같이 호출하면 작업을 수행하지 않는다는 것을 깨달았습니다.

res=$(func)

나는 내가 서브 쉘을 생성했고 “exit 1″이 기본 서브 쉘이 아니라 그 서브 쉘을 중단한다는 것을 이해합니다 ….

그러나 호출 방법에 관계없이 전체 실행을 중단하는 함수를 작성하는 방법이 있습니까? 함수에 의해 반향되는 실제 반환 값을 가져 오면됩니다.



답변

수있는 일은 TERM신호가 종료 할 최상위 셸을 등록한 다음 최상위 셸로를 보내는 것입니다 TERM.

#!/bin/bash
trap "exit 1" TERM
export TOP_PID=$$

function func()
{
   echo "Goodbye"
   kill -s TERM $TOP_PID
}

echo "Function call will abort"
echo $(func)
echo "This will never be printed"

따라서 함수는 TERM제공된 명령,이 경우 "exit 1".


답변

명령이 0이 아닌 상태로 종료되는 경우set -e 어떤 종료 를 사용할 수 있습니다 .

set -e
func
set +e

또는 반환 값을 가져옵니다.

(func) || exit $?


답변

자식 프로세스는 부모 프로세스를 암시 적으로 닫을 수 없습니다. 일종의 신호 메커니즘을 사용해야합니다. 옵션에는 특별한 반환 값이 포함되거나 kill다음과 같이 신호를 보낼 수 있습니다.

function child() {
    local parent_pid="$1"
    local other="$2"
    ...
    if [[ $failed ]]; then
        kill -QUIT "$parent_pid"
    fi
}


답변

더 나은 것 같아요

#!/bin/bash
set -e
trap "exit 1" ERR

myfunc() {
     set -x # OPTIONAL TO SHOW ERROR
     echo "Exit with failure"
     set +x # OPTIONAL
     exit 1
}
echo "BEFORE..."
myvar="$(myfunc)"
echo "AFTER..But not shown"


답변

그러나 호출 방법에 관계없이 전체 실행을 중단하는 함수를 작성하는 방법이 있습니까?

아니.

함수에 의해 반향되는 실제 반환 값을 가져 오면됩니다.

당신은 할 수 있습니다

res=$(func)
echo $?


답변