Bagaimana saya bisa menggaungkan "$" di sini-doc di bash?
Sebagai contoh, saya ingin memiliki file dengan konten di server jarak jauh suka $ABC=home_dir
.
$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF
Tetapi itu akan diperlakukan sebagai variabel. Bagaimana saya bisa mencetak literal $
?
scp
?Jawaban:
Jika Anda ingin menulis dokumen di sini dan Anda tidak ingin dokumen APAPUN diperluas atau karakter khusus apa pun ditafsirkan, Anda dapat mengutip label dengan tanda kutip tunggal, seperti ini:
Namun, situasi Anda seperti yang dijelaskan dalam contoh Anda jauh lebih kompleks, karena Anda benar-benar mengirim konten ini melalui ssh, ke sistem jarak jauh, untuk dijalankan oleh sudo yang juga menggunakan shell (dan agar shell akan memperluas kontennya) demikian juga). Anda akan memerlukan lebih banyak tingkat kutipan untuk mendapatkan ini dengan benar, tetapi bahkan dengan itu masih tidak akan berhasil karena sudo memerlukan terminal (sehingga dapat meminta kata sandi) dan Anda telah diarahkan dari stdin. Bahkan menggunakan
ssh -t
tidak akan membantu di sini.Saya juga setuju dengan Johan. Tidak jelas apakah ini yang Anda inginkan; perhatikan bahwa tidak sah untuk memberikan nilai ke referensi variabel shell, jadi jika file yang Anda coba buat ini seharusnya berupa skrip shell, itu tidak akan berfungsi seperti yang Anda jelaskan. Mungkin jika Anda sedikit mencadangkan dan menjelaskan apa yang benar - benar ingin Anda lakukan, kami dapat membantu lebih banyak.
sumber
Melarikan diri
$
Aku tidak tahu apa kasus penggunaan Anda tetapi biasanya Anda ingin
home_dir=$ABC
bukan$ABC=home_dir
.sumber
=home_dir
ke file? Tentu saja saya tidak tahu apa gunanya ...$
yang akan dikirim ke remote shell, tapi kemudian itu shell akan memperluas$ABC
sebelum menggemakan string untukfile
. Untuk menulis literal$
ke file, Anda akan memerlukan backslash (melarikan diri) lain:,echo "\\\$ABC=home_dir"
sehingga shell remote menerimaecho "\$ABC=home_dir"
.Cara pelarian yang termurah adalah
sumber
Anda menghemat sedikit kutipan dengan mengirimkan string ke
cat
proses di ujung jarak jauh:Kutipan tunggal melindungi
$
di ujung lokal, dan string tidak pernah dilihat oleh shell di sisi lain karena dibaca langsung olehcat
(viasudo
), daripada menjadi argumen ke perintah shell lain.Dengan kode Anda, Anda perlu lapisan tambahan untuk melindungi
$
:Anda perlu mengirim literal
\$
ke host jarak jauh, sehingga shell jarak jauh akan menulis literal$
ke file. Anda juga dapat menyederhanakan ini dengan mengutip penanda di sini-doc:sumber