做时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}
,但在构造字符串时,第二个中的单引号没有任何意义。假设您没有名为NF
Defined 的 shell 变量,后者给出
bash -c " ... awk '{print }' ..."
所以 awk 会打印命令的所有输出aws
,并且 shell 会给出语法错误。
$( ... ) 也可能在错误的时间被评估。
一般来说,总是使用单引号而不是双引号,除非您想要评估的变量。