使用 /bin/bash -ac 在容器 shell raw 和命令中运行命令,得到不同的结果

使用 /bin/bash -ac 在容器 shell raw 和命令中运行命令,得到不同的结果

做时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

为此,我获取相关路径下的所有文件并提取。但是,当以这种方式通过 shell 执行完全相同的操作时:

/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 的 shell 变量,后者给出

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

所以 awk 会打印命令的所有输出aws,并且 shell 会给出语法错误。

$( ... ) 也可能在错误的时间被评估。

一般来说,总是使用单引号而不是双引号,除非您要评估的变量。

相关内容