github 워크플로에 이 내용이 있습니다.
- run: bash --version
- name: run postgres
run: |
set -e
shopt -s inherit_errexit
export ID=$(docker run \
--publish 5432:5432 \
--network skynet \
--network-alias db.host \
--env-file .github/env/postgres \
--detach ${{ steps.postgres-tag.outputs.data }} )
shell: bash -euET -o pipefail -O inherit_errexit {0}
실행한 결과입니다
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
set -e
shopt -s inherit_errexit
export ID=$(docker run \
--publish 5432:5432 \
--network skynet \
--network-alias db.host \
--env-file .github/env/postgres \
--detach )
shell: /bin/bash -euET -o pipefail -O inherit_errexit {0}
env:
AWS_DEFAULT_REGION: us-east-1
AWS_REGION: us-east-1
AWS_ACCESS_KEY_ID: ***
AWS_SECRET_ACCESS_KEY: ***
"docker run" requires at least 1 argument.
See 'docker run --help'.
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
bash 5를 사용하는 OS X의 최소 복사본
bash-5.0$ export ID=$(docker run)
"docker run" requires at least 1 argument.
See 'docker run --help'.
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
bash-5.0$ echo $?
0
bash-5.0$ docker run
"docker run" requires at least 1 argument.
See 'docker run --help'.
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
> echo $? # services -> feature/RS2-1228-optimize-build $ ! RC=1
1
그러나 쉘은 오류와 함께 종료되지 않습니다. 나는 일반적으로 서브쉘이 $()
오류를 발생시키지 않는다는 것을 알고 있지만 이 설정이 shopt -s inherit_errexit
문제를 해결한다고 생각합니다. 내 코드에 누락된 것이 있나요?
답변1
비교:
$ bash -e -c 'export a=$(false); echo >&2 "If you see this, the previous command succeeded"'
If you see this, the previous command succeeded
$ bash -e -c 'a=$(false); echo >&2 "If you see this, the previous command succeeded"'
귀하의 시도에서 명령 대체 명령이 실패했지만 명령은포함하다명령 대체에 성공했습니다. 명령 대체가 일반 명령(내장 명령 호출 포함)인 경우 명령 대체 상태는 포함된 명령의 상태에 영향을 주지 않습니다 export
. 명령 대체 상태는 할당 내에서만 중요합니다. 할당된 명령의 상태는 명령의 마지막 명령 대체 상태이거나 명령 대체가 없는 경우 0입니다(할당 자체에 오류가 없다고 가정). 읽기 전용 변수에 할당하려고 시도하는 것과 같습니다).
첫 번째 오류에서 스크립트를 중지하려면 다음을 활성화해야 합니다.inherit_errexit
그리고각 명령 대체를 별도의 할당에 넣습니다. 이는 간단한 할당이어야 합니다. 내보낸 변수는 별도의 명령이어야 합니다.
$ bash -e -O inherit_errexit -c 'export a=$(false; echo >&2 "If you see this, errexit is off inside command substitution"); echo >&2 "If you see this, the previous command succeeded"'
If you see this, the previous command succeeded
$ bash -e -O inherit_errexit -c 'a=$(false; echo >&2 "If you see this, errexit is off inside command substitution"); echo >&2 "If you see this, the previous command succeeded"'