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

Docker exec传递带awk管道的fmsadmin命令失败求助

问题原因与解决方法

核心原因

你遇到的问题是外部Shell提前解析了awk命令里的$2:
当用外层双引号包裹sh -c的参数时,本地bash会先把$2替换成当前shell环境中的第二个位置参数(通常是空值),导致传到容器内部的awk命令变成{print ; }——等于没有做任何列过滤,所以输出和不加awk时完全一致。

而你尝试转义单引号时报错,是因为在双引号环境中转义单引号的方式错误,导致容器内的sh解析命令时出现语法错误(单引号未正确闭合、括号不匹配)。

正确的解决写法

有两种可靠的修复方式:

1. 转义$符号,阻止外部Shell解析

把awk里的$2改成\$2,让外部bash把$当作普通字符传递给容器内的sh:

sudo docker exec -it ebf3769c5611 sh -c "fmsadmin list schedules -u username -p password | awk '{print \$2; }'"

2. 改用单引号包裹整个sh -c命令

外层用单引号的话,内部的所有特殊字符(包括$)都会被当作普通字符,不会被外部Shell解析:

sudo docker exec -it ebf3769c5611 sh -c 'fmsadmin list schedules -u username -p password | awk "{print $2; }"'

如果坚持用单引号包裹awk脚本,需要转义内部的单引号(可读性稍差):

sudo docker exec -it ebf3769c5611 sh -c 'fmsadmin list schedules -u username -p password | awk '\''{print $2; }'\'''

验证逻辑

你可以先测试简化版命令确认转义效果:
执行sh -c "echo \$2"会输出$2;而直接执行sh -c "echo $2",会输出当前shell的$2值(通常为空),直观体现外部Shell对$的解析差异。

内容的提问来源于stack exchange,提问作者3rdrockdata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:27:21