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
相关产品推荐
相关产品推荐

