구분된 문서 내에서 실행되는 스크립트의 종료 코드를 캡처할 수 없습니다.

구분된 문서 내에서 실행되는 스크립트의 종료 코드를 캡처할 수 없습니다.

Docker 컨테이너의 Heredoc에서 실행 중인 스크립트의 종료 코드를 캡처하려고 하다가 막혔습니다.

python:3.7로드된 Docker 컨테이너를 시작 하고 그 안에서 heredoc를 실행하기 위해 이 명령을 실행한다고 가정해 보겠습니다 .

docker run -v $PWD:/workspace -w /workspace --rm -i python:3.7 <<-EOF
    ./script.sh
    echo $?
EOF

script.sh다음과 같다고 가정 해 보겠습니다 .

echo 'Before'
exit 1
echo 'After'

실행해보니 안되네요

Before
1

예상했던 대로지만 더 정확하게는

Before
0

다음과 같은 변수에 종료 코드를 할당하려고 하면

./script.sh
code=$?
echo $code

알겠어요:

Before

script.sh구분된 문서 내에서 실행되는 종료 코드를 안정적으로 캡처하는 방법은 무엇입니까?


컨테이너에서 직접 동일한 명령 시퀀스를 실행하면 제대로 작동하므로 처음에는 구분된 문서 내에서 실행하는 것과 관련이 있다고 생각합니다.

답변1

여기에 있는 귀하의 문서는 인용되지 않았습니다. 이는 호출 쉘이 변수를 전달하기 전에 변수를 확장한다는 것을 의미합니다 docker.

두 가지 솔루션:

  1. 초기 여기 문서 구분 기호의 일부를 참조하여 이 문서를 참조하세요.

    docker ... <<-'MY_SCRIPT'
        ./script.sh
        echo "$?"
    MY_SCRIPT
    

    'MY_SCRIPT', , 또는 "MY_SCRIPT"의 모든 변형이 \MY_SCRIPT작동합니다(심지어 'MY'_SCRIPT등). 실제 구분 기호는 단어여야 하며 일반적으로 대문자로 작성됩니다. 코드를 문서화하는 방법으로 리디렉션 문서를 추가로 설명하기 위해 단어를 사용합니다.

  2. $쉘이 특정 변수를 확장하지 못하도록 리디렉션 문서의 문자를 이스케이프 처리합니다 .

    docker ... <<-MY_SCRIPT
        ./script.sh
        echo "\$?"
    MY_SCRIPT
    

    이 대체 솔루션은 일반적으로 호출 셸에서 확장해야 하는 변수의 조합과 있는 그대로 전달해야 하는 추가 변수가 문서에 포함되어 있는 경우에 사용됩니다.

관련 정보