Linux
通過 ssh 執行時出現奇怪的“sh -c”行為
我正在嘗試執行一些命令,
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
even withsh -c
?
這裡發生了一些不同的不直覺的事情。
首先,您對遠端主機的命令被解析為
(sh -c echo starting); who -b; date; echo $SHELL
外部引號被剝離,只剩下
echo starting
run insh
這就是為什麼$SHELL
設置為/bin/bash
.其次,由於此答案中所述的原因,未列印“開始”: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"'