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

Bas*_*ozz 4 ssh bash

当我通过 ssh 向远程服务器发送命令时,它们之间的区别是什么:

ssh user@123.456.789.012 'foo'
Run Code Online (Sandbox Code Playgroud)

ssh user@123.456.789.012 "foo"
Run Code Online (Sandbox Code Playgroud)

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

Lad*_*ada 9

那个例子可能没有区别,但肯定会有这个例子:

ssh user@123.456.789.012 "echo $PATH"
Run Code Online (Sandbox Code Playgroud)

原因是 bash 会在本地机器上评估和替换双引号内的变量,但会在单引号内的目标机器上进行

子shell也是如此:

ssh user@123.456.789.012 "echo `hostname`"
ssh user@123.456.789.012 "echo $(hostname)"
Run Code Online (Sandbox Code Playgroud)

但是,对于函数来说似乎不是这样:

$ foo () { echo "Foo"; }
$ foo
Foo
$ ssh user@123.456.789.012 "foo"
bash: foo: command not found
Run Code Online (Sandbox Code Playgroud)

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

$ ssh user@123.456.789.012 "ls -l *"
$ ssh user@123.456.789.012 "ls -l numbered_files.?.gz"
Run Code Online (Sandbox Code Playgroud)