
Ao fazer docker exec -it [container_id] /bin/bash
:
Executei o seguinte:
Suponha que a pasta test/data
exista.
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 NF
definida, a última fornece
bash -c " ... awk '{print }' ..."
então awk imprime toda a saída do seu aws
comando 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.