How have both local and remote variable inside an SSH command

bash, linux

Solution

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;'

Problem

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?

Original source