以下のコードを使用して、環境変数をリモート ホストに paas しようとしています。
ssh username@ip "env current_quarter=$current_quarter" sh -s << 'EOF'
pwd
echo "${current_quarter}"
EOF
pwd
リモート ホスト上の正しい場所を出力しますが、echo "${current_quarter}"
current_quarter は出力しません。
答え1
引用符で囲むことで、EOF
ローカルシェルにヒアドキュメントを展開せずにsshに渡すように指示します。bash ドキュメントこれはパラメータ展開、コマンド置換、算術展開に適用されます。
最初にこの回答を書いたときに私が考えていたのとは反対に、リモート シェルはこれによって影響を受けず、リモート シェルで直接書き込んだかのようにヒア ドキュメントを実行します (引用符で囲むことでローカル シェルでスキップされたすべての種類の展開と置換を含むEOF
)。
ローカル変数だけを使用する場合は、test
EOF から引用符を削除します。
ssh user@host sh -s <<EOF
pwd
echo $test
EOF
fish ユーザーの場合は次のようになります。
ssh user@host "\
pwd
echo $test
"
test
ローカル変数をリモート変数として渡しremote_test
、ローカルに展開しない場合は、変数をバックスラッシュでエスケープするだけです。
ssh user@host sh -s <<EOF
export remote_test=$test
pwd
echo "\${remote_test}"
EOF
編集:
ランニング:
ssh user@host "env remote_test=$test" sh -s <<'EOF'
pwd
echo "${remote_test}"
EOF
env
シェルの一部ではなく、非 Bourne シェルでも使用できるという点を除けば、3 番目のコード例と同等です。
(ただし、これは OP が示したコード例と同一ですが、OP がこの回答を正解としてマークしたため、特定の文字シーケンスに遭遇したときに env と export の動作が異なるのではないかと疑っていますが、この仮説を裏付ける決定的な証拠は見つかっていません。)