How can I have both local and remote variable in an ssh command? For example in the following sample code:
A=3;
ssh host@name "B=3; echo $A; echo $B;"
I have access to A but B is not accessible.
But in the following example:
A=3;
ssh host@name 'B=3; echo $A; echo $B;'
I don’t have A and just B is accessible.
Is there any way that both A and B be accessible?
I think this is what you want:
When you use double-quotes:
Your shell does auto expansion on variables prefixed with
$, so in your first example, when it seesbash expands it to:
and then passes
host@name "B=3; echo 3; echo ;"as the argument tossh. This is because you definedAwithA=3, but you never definedB, so$Bresolves to the empty string locally.When you use single-quotes:
Everything enclosed by single-quotes are interpreted as string-literals, so when you do:
the instructions
B=3; echo $A; echo $B;will be run once you log in to the remote server. You’ve definedBin the remote shell, but you never told it whatAis, so$Awill resolve to the empty string.So when you use
\$, as in the solution:\$means to interpret the$character literally, so we send literallyecho $Bas one of the instructions to execute remotely, instead of having bash expand$Blocally first. What we end up tellingsshto do is equivalent to this: