Выполнение необработанной команды в VS команды контейнера, используя / bin / bash -a c в оболочке, но не дает того же результата - PullRequest
0 голосов
/ 13 апреля 2020

При выполнении docker exec -it [container_id] /bin/bash:

я запустил следующее:
Предположим, папка test/data существует.

root@6f200d5b9691: 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

Для этого, Я получил все файлы по соответствующему пути и извлек!

Однако, когда я делаю то же самое через оболочку таким образом:
root@6f200d5b9691: /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'

Есть идеи, почему это происходит? Что я делаю не так?

Второй вариант запуска через /bin/bash -ac "[commands here]" важен, так как я хочу использовать его с помощью такой команды, как:
docker-compose run [service_name] /bin/bash -ac "[...]"

Ответы [ 2 ]

3 голосов
/ 13 апреля 2020

Если вы запускаете

bash -c "file=foo; echo $file"

, то ничего не печатается, потому что $file расширяется (до нуля) до того, как bash -c увидит его.

Решение заключается в использовании одинарных кавычек :

bash -c 'file=foo; echo "$file"'

Теперь bash -c получает возможность видеть весь аргумент без изменений.

Для вашего случая это означает

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'

, где вся строка одиночная -quoted. Это позволяет правильно указать $file; для команды awk мы должны экранировать $NF, потому что мы используем двойные кавычки. Альтернативой для этого является

awk '\''{print $NF}'\''

, чтобы получить одинарную кавычку в одну строку в кавычках.

0 голосов
/ 13 апреля 2020

$ () и $ var внутри двойной квоты разрешаются перед выполнением команды. Таким образом, $ file будет разрешен не внутри нового bash, а перед отправкой строки в bash. Поэтому я считаю, что $ file в этом случае будет пустым.

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