I think this is what you want:
A=3;
ssh host@name "B=3; echo $A; echo $B;"
When you use double-quotes:
Your shell does auto expansion on variables prefixed with $
, so in your first example, when it sees
ssh host@name "B=3; echo $A; echo $B;"
bash expands it to:
ssh host@name "B=3; echo 3; echo ;"
and then passes host@name "B=3; echo 3; echo ;"
as the argument to ssh
. This is because you defined A
with A=3
, but you never defined B
, so $B
resolves to the empty string locally.
When you use single-quotes:
Everything enclosed by single-quotes are interpreted as string-literals, so when you do:
ssh host@name 'B=3; echo $A; echo $B;'
the instructions B=3; echo $A; echo $B;
will be run once you log in to the remote server. You've defined B
in the remote shell, but you never told it what A
is, so $A
will resolve to the empty string.
So when you use $
, as in the solution:
$
means to interpret the $
character literally, so we send literally echo $B
as one of the instructions to execute remotely, instead of having bash expand $B
locally first. What we end up telling ssh
to do is equivalent to this:
ssh host@name 'B=3; echo 3; echo $B;'
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…