区切り文書内で実行されているスクリプトの終了コードをキャプチャすることはできません。

区切り文書内で実行されているスクリプトの終了コードをキャプチャすることはできません。

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

2つの解決策:

  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
    

    この代替ソリューションは、通常、呼び出しシェルで拡張する必要がある変数の組み合わせとそのまま渡す必要がある追加の変数が文書に含まれている場合に使用されます。

おすすめ記事