31

sshコマンドでローカル変数とリモート変数の両方を使用するにはどうすればよいですか?たとえば、次のサンプルコードでは次のようになります。

A=3;
ssh host@name "B=3; echo $A; echo $B;"

Aにはアクセスできますが、Bにはアクセスできません。

しかし、次の例では:

A=3;
ssh host@name 'B=3; echo $A; echo $B;'

私はAを持っておらず、Bだけにアクセスできます。

AとBの両方にアクセスできる方法はありますか?

4

1 に答える 1

73

私はこれがあなたが望むものだと思います:

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$Bssh

ssh host@name 'B=3; echo 3; echo $B;'
于 2012-12-11T18:26:43.987 に答える