当我通过 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)
我没有传递任何变量,并且在远程运行命令时得到不同的结果。
那个例子可能没有区别,但肯定会有这个例子:
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)