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