Saya mencoba menginterpolasi variabel di dalam heredoc bash:
var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF
Ini tidak berfungsi seperti yang saya harapkan ( $var
diperlakukan secara harfiah, tidak diperluas).
Saya perlu menggunakan sudo tee
karena membuat file memerlukan sudo. Melakukan sesuatu seperti:
sudo cat > /path/to/outfile <<EOT
my text...
EOT
Tidak berfungsi, karena >outfile
membuka file di shell saat ini, yang tidak menggunakan sudo.
''
), tetapi tidak mengutip pembatas yang mengaktifkan ekspansi (seolah-olah ada di""
). Namun, intuisi Anda benar di Perl, di mana heredoc dengan pengenal tanda kutip tunggal berperilaku seolah-olah itu dalam tanda kutip tunggal, satu dengan pengenal tanda kutip ganda seolah-olah dalam tanda kutip ganda, dan satu dengan pengenal tanda centang-balik seolah-olah dalam backticks ! Lihat: perlop: << EOFJawaban:
Sebagai jawaban untuk pertanyaan pertama Anda, tidak ada substitusi parameter karena Anda telah menempatkan pembatas dalam tanda kutip - manual bash mengatakan :
Jika Anda mengubah contoh pertama yang akan digunakan
<<EOF
alih-alih,<< "EOF"
Anda akan menemukan bahwa itu berfungsi.Dalam contoh kedua Anda, shell
sudo
hanya memanggil parametercat
, dan pengalihan berlaku untuk outputsudo cat
sebagai pengguna asli. Ini akan berhasil jika Anda mencoba:sumber
(cat > /path/to/outfile) <<EOF
disudo sh -c ... <<EOF
Jangan gunakan kutipan dengan
<<EOF
:Ekspansi variabel adalah perilaku default di dalam sini-docs. Anda menonaktifkan perilaku itu dengan mengutip label (dengan tanda kutip tunggal atau ganda).
sumber
Sebagai jawaban akhir dari jawaban sebelumnya di sini, Anda mungkin berakhir dalam situasi di mana Anda ingin beberapa tetapi tidak semua variabel diinterpolasi. Anda dapat menyelesaikannya dengan menggunakan backslash untuk menghindari tanda dolar dan backticks; atau Anda dapat meletakkan teks statis dalam suatu variabel.
Demo: https://ideone.com/rMF2XA
Perhatikan bahwa salah satu mekanisme penawaran -
\____HERE
atau"____HERE"
atau'____HERE'
- akan menonaktifkan semua interpolasi variabel, dan mengubah dokumen di sini menjadi sepotong teks literal.Tugas umum adalah menggabungkan variabel lokal dengan skrip yang harus dievaluasi oleh shell yang berbeda, bahasa pemrograman, atau host jarak jauh.
sumber