
При выполнении 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}
, но одинарные кавычки не имеют смысла во втором случае, пока строится строка. Если предположить, что у вас нет переменной оболочки с именем NF
defined, то последний вариант дает
bash -c " ... awk '{print }' ..."
поэтому awk выводит все выходные данные вашей aws
команды, а оболочка выдает вам синтаксические ошибки.
Вероятно, $( ... ) также вычисляется в неподходящее время.
В общем случае всегда используйте одинарные кавычки вместо двойных, если только вы нехотетьпеременные, подлежащие оценке.