ヒアドキュメントのbashで「$」をエコーするにはどうすればよいですか?
たとえば、$ABC=home_dir
のようなリモートサーバー上のコンテンツを含むファイルが必要です。
$ ssh hostname Sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF
しかし、それは変数として扱われます。リテラル$
を出力するにはどうすればよいですか?
Here-docを記述し、どのドキュメントも展開したくない、または特殊文字を解釈したくない場合は、次のようにラベルを一重引用符で囲むことができます。
$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF
ただし、この例では、シェルを呼び出しているSudoによって実行されるように、このコンテンツをsshを介してリモートシステムに送信するため、状況はさらに複雑になります(シェルがコンテンツを展開するため)同じように)。これを正しく行うには、より多くのレベルの引用符が必要になりますが、それでもSudoは端末を必要とし(パスワードを要求できるため)、標準入力からリダイレクトされているため、機能しません。 ssh -t
はここでは役に立ちません。
ヨハンにも同意します。これが本当に必要なものかどうかは明らかではありません。シェル変数参照に値を割り当てることは不正であることに注意してください。したがって、作成しようとしているこのファイルがシェルスクリプトであると想定されている場合は、説明したとおりに機能しません。多分あなたが少しバックアップして、あなたが本当にしたいことを説明すれば、私たちはより多くを助けることができます。
エスケープ$
$ ssh hostname Sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF
私はあなたのユースケースが何であるかわかりませんが、通常はあなたが欲しいですhome_dir=$ABC
の代わりに $ABC=home_dir
。
脱出の最も安い方法は
$ ssh hostname Sudo -s << \EOF
echo "$ABC=home_dir" > file
EOF
文字列をリモートエンドのcat
プロセスに送信することで、ある程度のクォートを節約できます。
echo 'echo $ABC=home_dir' | ssh hostname Sudo -s "cat > file"
一重引用符はローカルエンドの$
を保護します。文字列はcat
によって(Sudo
を介して)直接読み取られるため、他のシェルでは表示されません。別のシェルコマンドの引数よりも。
コードでは、$
を保護するためにエスケープの追加レイヤーが必要になります。
$ ssh hostname Sudo -s <<EOF
echo "\\\$ABC=home_dir" > file
EOF
リテラル\$
をリモートホストに送信して、リモートシェルがリテラル$
をファイルに書き込むようにする必要があります。ヒアドキュメントマーカーを引用することで、これを簡略化することもできます。
$ ssh hostname Sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF