运行以下命令时:
docker-machine ssh name-here "docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')"
我收到以下错误:
主机名:非法选项-我用法:主机名[-fs] [主机名]
这是因为该命令正尝试在没有hostname -I
标志的MacOS上的本地计算机上运行-I
。
我将完整命令封装在双引号中,因此我期望双引号的全部内容作为docker-machine ssh
的单个参数执行,但似乎并非如此。
我已经尝试过使用单引号('
),但这会干扰awk在打印前后的单引号要求。我什至尝试了疯狂的$$
,因为您会在主机名旁边的makefile中使用它,但这也不起作用。
当命令用双引号引起来时,为什么$(hostname -I | awk '{print $1}')
在主机上执行,我如何正确运行以上命令以在主机内使用主机名初始化Docker群?
Command substitutions在双引号内总是被“立即”执行,也就是说,作为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