web-dev-qa-db-ja.com

ヒアドキュメントに「$」を印刷する方法

ヒアドキュメントのbashで「$」をエコーするにはどうすればよいですか?

たとえば、$ABC=home_dirのようなリモートサーバー上のコンテンツを含むファイルが必要です。

$ ssh hostname Sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF

しかし、それは変数として扱われます。リテラル$を出力するにはどうすればよいですか?

44
user21485

Here-docを記述し、どのドキュメントも展開したくない、または特殊文字を解釈したくない場合は、次のようにラベルを一重引用符で囲むことができます。

$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF

ただし、この例では、シェルを呼び出しているSudoによって実行されるように、このコンテンツをsshを介してリモートシステムに送信するため、状況はさらに複雑になります(シェルがコンテンツを展開するため)同じように)。これを正しく行うには、より多くのレベルの引用符が必要になりますが、それでもSudoは端末を必要とし(パスワードを要求できるため)、標準入力からリダイレクトされているため、機能しません。 ssh -tはここでは役に立ちません。

ヨハンにも同意します。これが本当に必要なものかどうかは明らかではありません。シェル変数参照に値を割り当てることは不正であることに注意してください。したがって、作成しようとしているこのファイルがシェルスクリプトであると想定されている場合は、説明したとおりに機能しません。多分あなたが少しバックアップして、あなたが本当にしたいことを説明すれば、私たちはより多くを助けることができます。

69
MadScientist

エスケープ$

$ ssh hostname Sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF

私はあなたのユースケースが何であるかわかりませんが、通常はあなたが欲しいですhome_dir=$ABC の代わりに $ABC=home_dir

22
lesmana

脱出の最も安い方法は

$ ssh hostname Sudo -s << \EOF
echo "$ABC=home_dir" > file
EOF
9
Bernhard

文字列をリモートエンドの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
4
chepner