如何在ssh命令中同时拥有本地和远程变量?例如,在以下示例代码中:
A=3;
ssh host@name "B=3; echo $A; echo $B;"
Run Code Online (Sandbox Code Playgroud)
我可以访问A但是B无法访问.
但在以下示例中:
A=3;
ssh host@name 'B=3; echo $A; echo $B;'
Run Code Online (Sandbox Code Playgroud)
我没有A,只有B可以访问.
是否可以访问A和B?
sam*_*hen 63
我想这就是你想要的:
A=3;
ssh host@name "B=3; echo $A; echo \$B;"
Run Code Online (Sandbox Code Playgroud)
当您使用双引号时:
你的shell在前缀为变量的变量上进行自动扩展$,所以在你的第一个例子中,它看到了
ssh host@name "B=3; echo $A; echo $B;"
Run Code Online (Sandbox Code Playgroud)
bash将其扩展为:
ssh host@name "B=3; echo 3; echo ;"
Run Code Online (Sandbox Code Playgroud)
并然后传递host@name "B=3; echo 3; echo ;"作为参数ssh.这是因为您定义A了A=3,但从未定义过B,因此$B在本地解析为空字符串.
当您使用单引号时:
单引号括起来的所有东西都被解释为字符串文字,所以当你这样做时:
ssh host@name 'B=3; echo $A; echo $B;'
Run Code Online (Sandbox Code Playgroud)
B=3; echo $A; echo $B;登录到远程服务器后将运行说明.你已经B在远程shell中定义了,但是你从来没有告诉它是什么A,所以$A将解析为空字符串.
因此,当您使用时\$,如在解决方案中:
\$意味着$从字面上解释字符,因此我们将字面意思echo $B作为远程执行的指令之一发送,而不是$B首先在本地扩展bash .我们最终告诉ssh你做的事情等同于:
ssh host@name 'B=3; echo 3; echo $B;'
Run Code Online (Sandbox Code Playgroud)