この記事で「$」を印刷する方法

この記事で「$」を印刷する方法

Bashでこのドキュメントの「$」をどのようにエコーしますか?

たとえば、$ABC=home_dir

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

しかし、変数として扱われます。テキストを印刷するには$

答え1

これを文書化し、文書の内容を拡張したり、特殊文字を解釈したくない場合は、次のように単一引用符でタグを引用できます。

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

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

私もジョンの言葉に同意する。これが本当に欲しいものかどうかはわかりません。シェル変数参照に値を割り当てることは正当ではないので、生成したいファイルがシェルスクリプトの場合は何もしません。説明そのように動作します。たぶん一歩退いて自分の状況を説明したら本物より多くのことをしたい場合は、もっと助けてください。

答え2

逃げる$

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

あなたのユースケースが何であるかはわかりませんが、一般的にhome_dir=$ABC代わりに$ABC=home_dir

答え3

最も安く脱出する方法は

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

答え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

関連情報