我正在尝试构建一个 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 容器时,管道命令中的某些内容似乎需要特殊处理。
有人能看出为什么失败吗?
提前致谢!
问题是
$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
$