我认为这是您想要的:
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在远程外壳程序中定义了,但是您从未告诉过它是什么
A,因此
$A将解析为空字符串。
因此,当您使用时$
,如解决方案中所示:
$意思是按
$字面意义解释字符,因此我们按字面意义发送
echo $B作为远程执行指令之一,而不是先让bash
$B在本地扩展。我们最终告诉
ssh我们要做的事情等效于此:
ssh host@name 'B=3; echo 3; echo $B;'



