コンテナ シェルでコマンドを raw で実行すると、/bin/bash -ac を使用してコマンドを実行すると、異なる結果が得られます。

コンテナ シェルでコマンドを raw で実行すると、/bin/bash -ac を使用してコマンドを実行すると、異なる結果が得られます。

行う場合docker exec -it [container_id] /bin/bash

以下を実行しました:
フォルダーtest/dataが存在すると想定します。

for file in $(aws s3 ls s3://foo-bucket | awk '{print $NF}'); do
    aws s3 cp foo-bucket/${file} test/data && tar -xzf test/data/${file} -C test/data/
done

このため、関連するパスの下にあるすべてのファイルを取得して抽出します。ただし、シェル経由でまったく同じことを次のように実行すると、

/bin/bash -ac "for file in $(aws s3 ls s3://foo-bucket | awk '{print $NF}') ; do aws s3 cp foo-bucket/${file} test/data && tar -xzf test/data/${file} -C test/data/ ; done"

次のような奇妙なエラーが発生します:

/bin/bash: -c: line 1: syntax error near unexpected token foo1.tar.gz'
/bin/bash: -c: line 1: foo1.tar.gz ; do aws s3 cp s3://foo-bucket/foo1.tar.gz  test/data' && tar -xzf 'test/data/foo1.tar.gz' -C 'test/data/' ; done'

なぜそれが起こるのか分かりますか?

答え1

まったく同じではありません!awkを見てください。

 awk '{print $NF}'

そしてもう1つは

 bash -c " .... awk '{print $NF}' ..."

最初の は$シングルクォートで保護されているので、awk のプログラムは ですが、2 番目の文字列が構築されている間はシングルクォートは意味を持ちません。 というシェル変数が定義されていないと仮定すると、後者は{print $NF}次のようになります。NF

 bash -c " ... awk '{print }' ..."

そのため、awk はコマンドの出力をすべて印刷しaws、シェルは構文エラーを表示します。

$( ... ) もおそらく間違ったタイミングで評価されています。

一般的に、二重引用符ではなく一重引用符を使用してください。欲しい評価される変数。

関連情報