如何在docker exec中正确包裹需在容器内执行的Shell代码
解决Docker exec执行容器内Shell脚本的问题
你的问题核心是宿主机的Shell会先解析你双引号里的命令替换(ls /或$(ls /))和变量$i,导致这些操作在宿主机上提前执行,容器收到的是已经被拆分乱的命令,自然报语法错误。
给你几个可行的解决办法:
方法1:用单引号包裹容器内执行的命令
单引号会阻止宿主机Shell解析内部的特殊字符,让整个命令原封不动传到容器里执行:
# 反引号写法 docker exec test-container bash -c 'for i in `ls /`; do echo $i; done' # $(...)写法(更推荐,嵌套逻辑更清晰) docker exec test-container bash -c 'for i in $(ls /); do echo $i; done'
方法2:双引号内转义特殊字符
如果必须用双引号(比如需要嵌入宿主机的变量),就把命令替换里的或$,还有变量$i`都转义:
# 反引号转义 docker exec test-container bash -c "for i in \`ls /\`; do echo \$i; done" # $(...)转义 docker exec test-container bash -c "for i in \$(ls /); do echo \$i; done"
额外建议:更安全的遍历方式
用ls遍历文件有隐患(比如文件名含空格会被错误拆分),推荐直接用Shell通配符遍历,更可靠:
docker exec test-container bash -c 'for i in /*; do echo "${i##*/}"; done'
这里${i##*/}是取路径的最后部分,和ls输出的文件名效果一致,但能完美处理带空格的文件名。
内容的提问来源于stack exchange,提问作者true-zpw
相关产品推荐
相关产品推荐

