You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:17:22