我正在尝试运行一些命令,ssh
并对以下行为感到困惑sh -c
:
ssh myhost sh -c 'echo starting; who -b; date; echo $SHELL'
输出(注意:echo 的输出只是一个空行!)
system boot 2016-12-22 20:22
Thu Jan 26 06:12:52 UTC 2017
/bin/bash
如果没有sh -c
我得到正确的输出:
ssh myhost 'echo starting; who -b; date; echo $SHELL'
输出:
starting
system boot 2016-12-22 20:22
Thu Jan 26 06:18:28 UTC 2017
/bin/bash
问题:
- 为什么不能正确
sh -c
处理echo starting
命令?它输出一个空行。 - 为什么SHELL 设置为
/bin/bash
evensh -c
?
答案1
这里发生了一些不同的、不直观的事情。
首先,您对远程主机的命令被解析为
(sh -c echo starting); who -b; date; echo $SHELL
外部引号被去掉,只留下echo starting
run insh
这就是为什么$SHELL
设置为/bin/bash
。
其次,由于此答案中所述的原因,未打印“starting”:https://unix.stackexchange.com/a/253424
但是,您可以通过简单地将命令括在另一组引号中来解决这两个问题,这样您就可以
ssh myhost sh -c '"echo starting; who -b ; date; echo $SHELL"'
尽管我认为如果将单引号移出以包含命令,则会更清楚sh
:
ssh myhost 'sh -c "echo starting; who -b ; date; echo $SHELL"'