Bash 내보내기는 set -ex를 무시합니다.

Bash 내보내기는 set -ex를 무시합니다.

오늘 이상한 동작이 발생했습니다.

#!/bin/bash
set -ex
export a=$(cat foo)
echo "It's a living thing"
b=$(cat foo)
echo "This won't make it"

cat foo이것은 존재하지 않아도 멈추지 않습니다 foo. 그러나 내보내기가 없으면 실패합니다. 왜?

답변1

존재하다:

a=$(cmd)

이는 명령 부분이 없는 간단한 명령이므로 종료 상태는 명령 대체 상태입니다. 존재하다:

a=$(cmd) export a

또는

export a="$(cmd)"

여기에 명령 부분이 있으므로(일부 쉘에서도 export명령과 키워드 사이에 있음) 종료 상태가 반환됩니다. cmd실패하고 출력이 생성되지 않는 경우 export a=에도 계속 실행되고 성공하므로 export종료 상태 0이 반환됩니다.

원하는 곳은 다음과 같습니다.

a=$(cmd)
export a

또는 더 나은 방법은 신뢰할 수 없는 상황을 제거 set -e하고 수동으로 적절한 오류 처리를 수행하는 것입니다.

a=$(cmd) || exit
export a

예를 들어 참조하십시오.BashFAQ 015: "set -e가 내가 기대하는 대로 작동하지 않는 이유는 무엇입니까?"set -e예상치 못한 결과가 발생하는 이유와 방법에 대한 자세한 예를 알아보세요 .

관련 정보