通过 ssh 传递命令时单引号和双引号之间的区别

通过 ssh 传递命令时单引号和双引号之间的区别

当我通过 ssh 向远程服务器发送命令时,两者有何区别:

ssh [email protected] 'foo'

ssh [email protected] "foo"

我没有传递任何变量,并且在远程运行命令时得到了不同的结果。

答案1

对于那个例子来说可能没有什么区别,但是对于这个例子来说肯定会有区别:

ssh [email protected] "echo $PATH"

原因是 bash 将评估并替换双引号内的变量在本地机器上但会做到在目标机器上在单引号内。

对于子壳来说也是如此:

ssh [email protected] "echo `hostname`"
ssh [email protected] "echo $(hostname)"

然而,对于函数来说这似乎并不正确:

$ foo () { echo "Foo"; }
$ foo
Foo
$ ssh [email protected] "foo"
bash: foo: command not found

在双引号内也不会发生通配符:

$ ssh [email protected] "ls -l *"
$ ssh [email protected] "ls -l numbered_files.?.gz"

相关内容