선언 문이 실패하면 bash를 종료합니다.

선언 문이 실패하면 bash를 종료합니다.

너무 길어요.나중에 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사용법은 해결책이라기보다는 문제에 더 가깝다는 것이 밝혀졌습니다. 그것을 피하십시오.

관련 정보