这些命令如何导致不同的输出?
⋊> ssh host bash -c 'cd /tmp; pwd'
/home/manu
⋊> ssh host "bash -c 'cd /tmp; pwd'"
/tmp
这里对类似问题的回答指出:
尾随参数组合为一个字符串,该字符串作为参数传递给远程计算机上登录shell的-c选项。
在*
我能理解的情况下,但是在此示例中将对局部进行局部评估?同样,--
bash命令之前的命令也无济于事。
这里要理解的是,ssh
只需将其参数串联起来(以相同的方式$*
),然后将串联的字符串传递给sh -c
。
因此,在以下情况下:
ssh josh-play bash -c 'cd /tmp; pwd'
… ssh运行:
sh -c 'bash -c cd /tmp; pwd'
…因此,sh运行:
bash -c cd /tmp
pwd
…并且您可以测试自己,bash -c cd /tmp
没有做太多有用的事情(它运行的脚本文本仅由cd
;
组成/tmp
作为参数存储,但是脚本文本从不读取其参数,因此无济于事)。而且,一旦bash
退出,我们就返回到父sh
进程,该进程cd
从未运行过。
传递给外壳程序的句法引号完全丢失,并且pwd
不是由bash
您手动触发的调用(在此用法中,该调用只是在cd
没有任何参数的情况下调用了/tmp
in)$1
,而是作为参数传递给cd
从不取消引用的脚本该变量),但由sh
ssh隐式调用。
如果你知道你的遥控器sh
是由bash或ksh的提供-壳配套的$''
延伸-你可以做任意argv数组以下(在这种情况下bash
,-c
,cd /tmp; pwd
):
# ask your shell to generate an eval-safe quoted form of your argument list
printf -v rmt_cmd '%q ' bash -c 'cd /tmp; pwd'
# pass that through to be run by the remote sh -c
ssh josh-play "$rmt_cmd"
上面的警告是,如果您的参数列表可以包含换行符或隐藏的字符,则printf %q
bash或ksh可以以不能保证POSIX
sh能够读取的形式对其进行转义。为了避免这种情况:
# ask your shell to generate an eval-safe quoted form of your argument list
printf -v rmt_cmd '%q ' bash -c 'cd /tmp; pwd'
# ...and use bash to evaluate that quoted form.
ssh josh-play 'exec bash -s' <<<"$rmt_cmd"
我发现了一个结果 alpha命令和beta命令有什么区别?
我刚刚安装了Phonegap的第一个time.confuses我的事实是,一些文档正在使用命令“phonegap”和一些“cordova”是电话间隙和cordovan命令之间的区别?我需要使用哪个命令来创建phonegap应用程序?请任何人都可以帮助我?
问题内容: Dockerfile中的和命令之间有什么区别,何时可以在另一个之上使用? COPY指令将从以下位置复制新文件并将其添加到容器的文件系统中: ADD指令将从中复制新文件并将其添加到位于path的容器的文件系统中。 问题答案: 您应该查看和文档以获取有关其行为的更详细描述,但简而言之,主要区别在于可以做的还不止: 允许成为网址 参考下面的评论, 文档指出: 如果是以公认的压缩格式(身份,g
Dockerfile中的和命令之间有什么区别?什么时候我会使用一个命令而不是另一个命令? COPY指令将从复制新文件,并将它们添加到路径的容器文件系统中 ADD指令将从复制新文件,并将它们添加到路径的容器文件系统中。
问题内容: 我已经从nodejs.org上提供的tar文件中解压了node.js,但是当我尝试通过node命令执行我的js程序时,什么也没发生,但是另一方面,nodejs命令运行会执行该文件。 所以我的问题是 ,node命令和nodejs命令之间 有什么 区别, 因为我 不是从源代码构建的,这 会影响我的程序 。 我的原因就是这种差异。 问题答案: 这在很大程度上取决于许多因素。主要是,要看是什么
我有这个命令来编译我的程序。 我创建了以下makefile。 如果从terminal运行该命令将成功,但make将失败。 它将失败,并出现错误 该文件应该在命令中使用导入。 我认为Makefile中的命令执行起来很像bash脚本。 在bash中运行命令和在Makefile中运行命令有什么区别?