如何在 ssh 命令中同时拥有本地和远程变量?例如在以下示例代码中:
A=3;
ssh host@name "B=3; echo $A; echo $B;"
我可以访问 A 但无法访问 B。
但在以下示例中:
A=3;
ssh host@name 'B=3; echo $A; echo $B;'
我没有 A,只有 B 可以访问。
有什么方法可以同时访问 A 和 B?
我认为这就是你想要的:
A=3;
ssh host@name "B=3; echo $A; echo \$B;"
当您使用双引号时:
您的 shell 会对前缀为 的变量进行自动扩展$
,因此在您的第一个示例中,当它看到
ssh host@name "B=3; echo $A; echo $B;"
bash 将其扩展为:
ssh host@name "B=3; echo 3; echo ;"
然后作为参数传递给. 这是因为您定义了,但您从未定义,因此在本地解析为空字符串。host@name "B=3; echo 3; echo ;"
ssh
A
A=3
B
$B
当您使用单引号时:
单引号括起来的所有内容都被解释为字符串文字,所以当你这样做时:
ssh host@name 'B=3; echo $A; echo $B;'
一旦您登录到远程服务器,这些说明B=3; echo $A; echo $B;
就会运行。您已B
在远程 shell 中定义,但您从未告诉它是什么A
,因此$A
将解析为空字符串。
因此,当您使用 时\$
,如解决方案中所示:
\$
意思是按字面意思解释$
字符,所以我们按字面意思echo $B
作为指令之一发送远程执行,而不是让 bash$B
先在本地展开。我们最终告诉ssh
要做的事情是这样的:
ssh host@name 'B=3; echo 3; echo $B;'