使用 docker exec 时将管道 awk 命令作为命令传递给 Docker 时失败

问题描述 投票:0回答:1

我正在尝试构建一个 bash shell 脚本来帮助我监控 FileMaker Server 中备份计划的状态。

如果我在容器 shell 中运行以下 bash 命令,它可以正常工作

fmsadmin  list schedules -u username -p password'

它回来了

当我从用户 shell 将以下命令传递到容器中时,我得到相同的结果。

sudo docker exec -it ebf3769c5611 sh -c "fmsadmin  list schedules -u username -p password"

问题是,当我从用户 shell 添加管道 awk 命令(如下所示)时,它会得到相同的结果,而不是仅返回第 2 列,而当我在容器 shell 中运行相同的命令时,它会返回第 2 列。

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

我尝试转义单引号,但这只会给我一个错误

awk: 1: unexpected character '''
awk: line 2: missing } near end of file
sh: 1: }': not found

如果我通过管道传输不同的命令而不是 awk(例如列出文件而不是时间表),它会按预期工作。 awk 命令有问题。当作为命令传递到 docker 容器时,管道命令中的某些内容似乎需要特殊处理。

有人能看出为什么失败吗?

提前致谢!

bash docker awk pipe filemaker
1个回答
0
投票

问题是

$2
。您的 shell 将该变量扩展为空字符串,从而防止内部 awk 看到它。要修复它,请转义美元符号:
sudo docker exec -it ebf3769c5611 sh -c "fmsadmin  list schedules  -u username -p password | awk '{print \$2; }'"

郑重声明,这与 Docker 没有任何关系。这是问题和解决方案的最小示例:

$ echo one two three | awk '{print $2; }'
two
$ sh -c "echo one two three | awk '{print $2; }'"
one two three
$ sh -c "echo one two three | awk '{print \$2; }'"
two
$ 
© www.soinside.com 2019 - 2024. All rights reserved.