bash - 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?
解决方案
根据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}\'')'
请注意$1
in print 是如何用 a 转义的\
,并且一组单引号也在 print 周围转义。
推荐阅读
- vba - VBA:从多个工作表复制粘贴多个工作簿
- android - ProgressBar 对话框显示时底部导航卡住
- php - 想要删除 php 中最后一个“/”之后的所有内容
- c# - CultureInfo : 显示具有自己文化的语言
- javascript - 怎么做 $(element).function({})
- javascript - 当从网页进行 jQuery ajax 调用时调用内容脚本中的函数
- javascript - 展开网页上的所有可折叠部分
- javascript - 我在Promise的then()方法中执行Promsie.all(),Promsie.all()中的方法先执行。代码如下
- php - PHP - Laravel 检查全球首次登录
- google-apps-script - 使用 API 以编程方式创建 Google App 脚本