首页 > 解决方案 > docker-machine ssh 试图在本地机器上运行部分命令

问题描述

运行以下命令时:

docker-machine ssh name-here "docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')"

我收到以下错误:

主机名:非法选项 -- I 用法:主机名 [-fs] [主机名]

这是因为该命令试图hostname -I在我的本地机器上运行,在没有-I标志的 MacOS 上运行。

尝试在没有双引号的情况下运行会产生相同的错误。

我将完整的命令封装在双引号中,所以我的期望是双引号的全部内容作为单个参数执行docker-machine ssh,但似乎情况并非如此。

我已经尝试过单引号 ( ') 但这会干扰 awk 在打印时的单引号要求。我什至尝试了$$在主机名旁边的 makefile 中使用的疯狂方法,但这也不起作用。

当命令用双引号封装时,为什么$(hostname -I | awk '{print $1}')在主机上执行,如何正确运行上述命令以在机器内使用主机名初始化 docker swarm?

标签: bashdockerdocker-machine

解决方案


根据man bash

用双引号括起来的字符会保留引号内所有字符的字面值,除了 $,, \, and, when history expansion is enabled, !. The characters $ and在双引号内保留它们的特殊含义。反斜杠仅在后跟以下字符之一时才保留其特殊含义:$、`、"、\ 或除非出现在双引号中的 ! 使用反斜杠进行转义。不会删除 ! 之前的反斜杠。

因此,考虑到这一点,以下工作:

docker-machine ssh name-here 'docker swarm init --advertise-addr $(hostname -I | awk '\'{print \$1}\'')'

请注意$1in print 是如何用 a 转义的\,并且一组单引号也在 print 周围转义。


推荐阅读