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


42

bashのhere-docで「$」をエコーするにはどうすればよいですか?

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

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

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


2
単一引用符を使用できます
ラフルパティル'19年

2
それは多くの間接的なものです。ローカルホスト上にファイルを作成してから、それを作成することはできませんscpか?
l0b0

回答:


65

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

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

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

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


ここが非常に長いドキュメントに対応できるため、これが最良の回答です。それは(大部分)ばか防止です。
フェリペアルバレス14

22

エスケープ $

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

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


2
このソリューションは機能しますが、OPが望んでいるのは本当にですか?実行されると、割り当ての左側のABCを逆参照=home_dirし、ファイルに格納される可能性が高い文字列を「ファイル」に格納するシェルスクリプトが生成されるようです。もちろん、ユースケースが何であるかはわかりません
ヨハン

2
これにより、リテラル$がリモートシェルに送信されますが、そのシェルは$ABC文字列をにエコーする前に展開されfileます。リテラル$をファイルに書き込むには、別の(エスケープされた)バックスラッシュ:が必要echo "\\\$ABC=home_dir"になるため、リモートシェルはを受け取りecho "\$ABC=home_dir"ます。
-chepner


4

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

\$リモートシェルがリテラル$をファイルに書き込むように、リモートホストにリテラルを送信する必要があります。here-docマーカーを引用することで、これを単純化することもできます。

$ ssh hostname sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.