SSH経由で実行したときの奇妙な「sh -c」動作

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

質問:

  1. コマンドが正しくsh -c処理されないのはなぜですかecho starting?空行を出力します。
  2. /bin/bashSHELLが偶数に設定されているのはなぜですかsh -c

答え1

ここでは何か違って直感的ではないことが起こっています。

まず、リモートホストのコマンドは次のように解析されます。

(sh -c echo starting); who -b; date; echo $SHELL

外側の引用符は削除され、echo startingrun in のみが残るので、 にsh設定$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"'

関連情報