私はこれがあなたが望むものだと思います:
A=3;
ssh host@name "B=3; echo $A; echo \$B;"
二重引用符を使用する場合:
シェルは、プレフィックスが付いた変数に対して自動拡張を$
実行するため、最初の例では、
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
ため、空の文字列に解決されます。
したがって\$
、ソリューションのように、を使用する場合:
\$
文字を文字通りに解釈することを意味するため、bashを最初にローカルで展開するのではなく、リモートで実行するための命令の1つとして$
文字通り送信します。最終的に行うように指示することは、これと同等です。echo $B
$B
ssh
ssh host@name 'B=3; echo 3; echo $B;'