Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash docker计算机ssh试图在本地计算机上运行部分命令_Bash_Docker_Docker Machine - Fatal编程技术网

Bash docker计算机ssh试图在本地计算机上运行部分命令

Bash docker计算机ssh试图在本地计算机上运行部分命令,bash,docker,docker-machine,Bash,Docker,Docker Machine,运行以下命令时: docker-machine ssh name-here "docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')" 我得到以下错误: 主机名:非法选项--I 用法:主机名[-fs][主机名] 这是因为该命令试图在我的本地计算机上运行hostname-I,运行在没有-I标志的MacOS上 尝试在不使用双引号的情况下运行会出现相同的错误 我将full命令封装在双引号中,因此我希望双引号的完整内容作

运行以下命令时:

docker-machine ssh name-here "docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')"
我得到以下错误:

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

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

尝试在不使用双引号的情况下运行会出现相同的错误

我将full命令封装在双引号中,因此我希望双引号的完整内容作为
docker machine ssh
的单个参数执行,但情况似乎并非如此

我尝试过单引号(
),但这会干扰awk对印刷品的单引号要求。我甚至尝试了疯狂的
$$
,就像您在主机名旁边的makefile中使用的那样,但这也不起作用

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

双引号中的总是“立即”执行,即,作为Bash扩展命令的一部分。引用命令替换所需的是使用单引号。比较双引号(本地替换):

和单引号(远程替换):

在双引号中,始终“立即”执行,也就是说,作为Bash扩展命令的一部分。引用命令替换所需的是使用单引号。比较双引号(本地替换):

和单引号(远程替换):


根据man bash:

将字符括在双引号中会保留引号中所有字符的文字值,除了$,
,\,以及启用历史扩展时的!。字符$和
在双引号内保留其特殊含义。反斜杠只有在后跟以下字符之一时才保留其特殊含义:$,`,“,\,或。双引号可以通过在双引号前加反斜杠在双引号内引用。如果启用,将执行历史扩展,除非!出现在双引号中时使用反斜杠进行转义。前面的反斜杠!没有删除

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

docker machine ssh name here'docker swarm init--advision addr$(主机名-I | awk'\'{print\$1}\'')


请注意打印中的
$1
是如何用
\
转义的,并且打印周围的一组单引号也是如何转义的。

根据
man bash

将字符括在双引号中会保留引号中所有字符的文字值,除了$,
,\,以及启用历史扩展时的!。字符$和
在双引号内保留其特殊含义。反斜杠只有在后跟以下字符之一时才保留其特殊含义:$,`,“,\,或。双引号可以通过在双引号前加反斜杠在双引号内引用。如果启用,将执行历史扩展,除非!出现在双引号中时使用反斜杠进行转义。前面的反斜杠!没有删除

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

docker machine ssh name here'docker swarm init--advision addr$(主机名-I | awk'\'{print\$1}\'')


请注意打印中的
$1
是如何用
\
转义的,并且打印中的一组单引号也是如何转义的。

谢谢您的回答!我尝试了单引号,但我无法让它们与所描述的awk一起工作。你有没有可能根据我特定的awk问题来解释这一点?谢谢:-)好的,您基本上有一个三层嵌套的命令。您要做的是分别对命令的每一级执行
printf“%q”
(从
awk
参数开始,然后向外)来设法将其全部转义。谢谢您的回答!我尝试了单引号,但我无法让它们与所描述的awk一起工作。你有没有可能根据我特定的awk问题来解释这一点?谢谢:-)好的,您基本上有一个三层嵌套的命令。您要做的是分别对命令的每一级执行
printf“%q”
(从
awk
参数开始并向外)以设法将其全部转义。
$ 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