Executando o comando no shell do contêiner raw vs comando usando /bin/bash -ac, obtendo resultados diferentes

Executando o comando no shell do contêiner raw vs comando usando /bin/bash -ac, obtendo resultados diferentes

Ao fazer docker exec -it [container_id] /bin/bash:

Executei o seguinte:
Suponha que a pasta test/dataexista.

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

Para isso, pego todos os arquivos no caminho relevante e os extraio. No entanto, ao fazer exatamente o mesmo via shell desta maneira:

/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"

Recebo erros estranhos, como:

/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'

Alguma ideia de por que isso acontece?

Responder1

Eles não são exatamente iguais! Olha o awk, em um você tem

 awk '{print $NF}'

e no outro você tem

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

No primeiro, o $é protegido por aspas simples, então o programa para awk é {print $NF}, mas as aspas simples não têm significado no segundo enquanto a string está sendo construída. Supondo que você não tenha uma variável shell chamada NFdefinida, a última fornece

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

então awk imprime toda a saída do seu awscomando e o shell fornece erros de sintaxe.

O $( ... ) provavelmente também está sendo avaliado na hora errada.

Em geral, use sempre aspas simples em vez de aspas duplas, a menos que vocêquerervariáveis ​​a serem avaliadas.

informação relacionada