docker-machine ssh 尝试 运行 本地机器上的部分命令
docker-machine ssh trying to run part of command on local machine
当运行执行以下命令时:
docker-machine ssh name-here "docker swarm init --advertise-addr $(hostname -I | awk '{print }')"
我收到以下错误:
hostname: illegal option -- I
usage: hostname [-fs] [name-of-host]
这是因为该命令试图在我的本地计算机上 运行 hostname -I
,在没有 -I
标志的 MacOS 上 运行ning。
尝试 运行 不带双引号会产生同样的错误。
我用双引号封装了完整的命令,所以我的期望是双引号的全部内容作为 docker-machine ssh
的单个参数执行,但似乎并非如此。
我试过单引号 ('
) 但这会干扰 awk 在打印时的单引号要求。我什至尝试了疯狂的 $$
,就像您在主机名旁边的 makefile 中使用的那样,但这也不起作用。
为什么 $(hostname -I | awk '{print }')
当命令用双引号括起来时在主机上执行,我如何 运行 上面的命令正确地初始化一个 docker swarm机器内的主机名?
双引号内的Command substitutions总是执行"immediately",即作为Bash展开命令的一部分。引用命令替换需要做的是使用 单 引号。比较双引号(局部替换):
$ bash --noprofile --norc -o xtrace
bash-4.4$ ssh 127.0.0.1 "echo ${SSH_CONNECTION-No SSH connection}"
+ ssh 127.0.0.1 'echo No SSH connection'
No SSH connection
和单引号(远程替换):
bash-4.4$ ssh 127.0.0.1 'echo ${SSH_CONNECTION-No SSH connection}'
+ ssh 127.0.0.1 'echo ${SSH_CONNECTION-No SSH connection}'
127.0.0.1 59618 127.0.0.1 22
根据man bash
:
Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of $, , \, and, when history expansion is enabled, !. The characters $ and
retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: $, `, ", \, or . A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ! appearing in double quotes is escaped using a backslash. The backslash preceding the ! is not removed.
考虑到这一点,以下工作:
docker-machine ssh name-here 'docker swarm init --advertise-addr $(hostname -I | awk '\'{print $1}\'')'
注意 print 中的 </code> 是如何用 <code>\
转义的,并且一组单引号也在 print 周围转义。
当运行执行以下命令时:
docker-machine ssh name-here "docker swarm init --advertise-addr $(hostname -I | awk '{print }')"
我收到以下错误:
hostname: illegal option -- I usage: hostname [-fs] [name-of-host]
这是因为该命令试图在我的本地计算机上 运行 hostname -I
,在没有 -I
标志的 MacOS 上 运行ning。
尝试 运行 不带双引号会产生同样的错误。
我用双引号封装了完整的命令,所以我的期望是双引号的全部内容作为 docker-machine ssh
的单个参数执行,但似乎并非如此。
我试过单引号 ('
) 但这会干扰 awk 在打印时的单引号要求。我什至尝试了疯狂的 $$
,就像您在主机名旁边的 makefile 中使用的那样,但这也不起作用。
为什么 $(hostname -I | awk '{print }')
当命令用双引号括起来时在主机上执行,我如何 运行 上面的命令正确地初始化一个 docker swarm机器内的主机名?
Command substitutions总是执行"immediately",即作为Bash展开命令的一部分。引用命令替换需要做的是使用 单 引号。比较双引号(局部替换):
$ bash --noprofile --norc -o xtrace
bash-4.4$ ssh 127.0.0.1 "echo ${SSH_CONNECTION-No SSH connection}"
+ ssh 127.0.0.1 'echo No SSH connection'
No SSH connection
和单引号(远程替换):
bash-4.4$ ssh 127.0.0.1 'echo ${SSH_CONNECTION-No SSH connection}'
+ ssh 127.0.0.1 'echo ${SSH_CONNECTION-No SSH connection}'
127.0.0.1 59618 127.0.0.1 22
根据man bash
:
Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of $,
, \, and, when history expansion is enabled, !. The characters $ and
retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: $, `, ", \, or . A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ! appearing in double quotes is escaped using a backslash. The backslash preceding the ! is not removed.
考虑到这一点,以下工作:
docker-machine ssh name-here 'docker swarm init --advertise-addr $(hostname -I | awk '\'{print $1}\'')'
注意 print 中的 </code> 是如何用 <code>\
转义的,并且一组单引号也在 print 周围转义。