Выполнение команды в контейнерной оболочке 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}'

а в другом у вас есть

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

В первом случае $защищен одинарными кавычками, поэтому программа для awk — {print $NF}, но одинарные кавычки не имеют смысла во втором случае, пока строится строка. Если предположить, что у вас нет переменной оболочки с именем NFdefined, то последний вариант дает

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

поэтому awk выводит все выходные данные вашей awsкоманды, а оболочка выдает вам синтаксические ошибки.

Вероятно, $( ... ) также вычисляется в неподходящее время.

В общем случае всегда используйте одинарные кавычки вместо двойных, если только вы нехотетьпеременные, подлежащие оценке.

Связанный контент