너무 길어요.나중에 bash가 자동으로 종료되기를 원합니다 declare var=$(false)
.
내 bash 스크립트는 set -e
(또는 set errexit
)을 사용합니다. 그러나 declare
변수 선언 idiom 을 사용할 때 declare
쉘 대체에서 반환 코드를 "방지"하는 것 같습니다 .
$ var=$(false)
$ echo $?
1
$ declare var=$(false)
$ echo $?
0
따라서 bash는 오류와 함께 종료되지 않습니다. 테스트할 수 있다는 것을 알고 있지만 var
모든 명령문 이후에는 너무 많은 문제가 발생합니다 declare
.
실패 후 bash를 자동으로 종료하는 방법은 무엇입니까 declare
?
편집하다: 명확히 하기 위해 1) 가능한 로컬 범위 변수에 작동하고, 2) 가능한 읽기 전용 변수에 작동하고, 3) 하나의 명령문만 필요하다는 답변을 찾고 있습니다.
답변1
사용 set -e
의지아니요가지고 있는 코드를 사용하면 예상대로 작동합니다. 그 이유는 errexit
트리거 명령이 0이 아닌 종료 코드를 반환해야 하기 때문입니다.
declare var=$(false)
할당 false
및 결과로 $(..)
인해 0이 아닌 종료 코드가 발생하더라도 을 사용하면 declare
이 오류 코드가 난독화되고 명령 자체가 문제 없이 실행되므로 변수에 값을 할당하면 var
내장 delcare
기능이 종료 코드를 설정하여 0
오류를 발생시킵니다. 발동하지 않습니다.
이 문제를 해결하는 한 가지 방법은 declare
초기화와 할당을 분리 하는 것입니다.
#!/usr/bin/env bash
set -e
declare var
var=$(false)
위의 상황에서 사용하면 declare
과 같은 다른 내장 함수 export
뿐만 아니라 local
종료 코드도 모호해집니다. local
함수의 사용법 보기
set -e
f() { local var=$(false); }
f
위의 경우와 마찬가지로 declare
함수에서 local
설정된 종료 코드가 숨겨져 있습니다 $(..)
. var
작동 하려면 초기화와 할당을 분리해야 합니다 .
BashFAQ/105 - -e를 설정(또는 -o errexit 또는 트랩 ERR을 설정)하면 예상한 대로 작동하지 않는 이유는 무엇입니까?사용되는 트랩 set -e
과 권장되는 오류 처리 메커니즘이 자세히 설명되어 있습니다.
답변2
할당 오른쪽에 있는 오류와 사용된 명령을 구분해야 합니다. 명령문 명령에 대한 "한 줄 솔루션"을 원하는 경우 다음을 사용할 수 있습니다.
value=$(false); declare -r var="$value"
새 변수를 사용하지 않으려면 $REPLY
(읽기에 사용됨) 또는 $_
(이전 명령줄의 마지막 인수)와 같은 내장 임시 변수를 사용할 수 있습니다.
사용법은 $REPLY
간단할 수 있습니다:
REPLY=$(false); declare -r var="$REPLY"
사용법이 $_
복잡하거나 혼란스러울 수 있습니다.
나에게 있어서: set -e
사용법은 해결책이라기보다는 문제에 더 가깝다는 것이 밝혀졌습니다. 그것을 피하십시오.