반응형
호출 방법에 관계없이 전체 실행을 중단하는 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
신호가 종료 할 최상위 쉘을 등록한 다음 최상위 쉘에 a 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 $?
그러나 호출 방법에 관계없이 전체 실행을 중단하는 함수를 작성하는 방법이 있습니까?
아니.
실제 반환 값 (함수에 의해 에코 됨)을 가져 오면됩니다.
당신은 할 수 있습니다
res=$(func)
echo $?
자식 프로세스는 부모 프로세스를 암시 적으로 닫을 수 없습니다. 어떤 종류의 신호 메커니즘을 사용해야합니다. 옵션에는 특별한 반환 값이 포함되거나 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"
반응형
'programing' 카테고리의 다른 글
정적 배열을 초기화하는 방법은 무엇입니까? (0) | 2020.11.08 |
---|---|
R에서 결 측값이있는 랜덤 포레스트를 사용하는 방법은 무엇입니까? (0) | 2020.11.08 |
Java에서 휘발성 키워드의 가장 간단하고 이해하기 쉬운 예 (0) | 2020.11.08 |
ES6 / 7에서 Arrow 함수를 내보낼 수 있습니까? (0) | 2020.11.08 |
Android Studio에서 Jack (Java Android Compiler Kit)을 활성화하는 방법 (0) | 2020.11.07 |