오늘 이상한 동작이 발생했습니다.
#!/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
예상치 못한 결과가 발생하는 이유와 방법에 대한 자세한 예를 알아보세요 .