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

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

するとき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}'

他の場所には

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

最初のものは$一重引用符で保護されているため、awkのプログラムはですが、{print $NF}文字列を構成するときの2番目の引用符は意味がありません。NFDefinedというシェル変数がないと仮定すると、後者は次のようになります。

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

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

$( ... ) も誤った時間に評価される可能性があります。

通常、次のような場合を除き、常に二重引用符ではなく一重引用符を使用してください。考える評価する変数です。

関連情報