Bagaimana Anda melarikan diri karakter dalam heredoc?

22

Saya bekerja dengan skrip bash yang mencoba menghentikannya dari mencoba mengganti variabel di dalam heredoc saya. Bagaimana cara menetapkan heredoc ke A) keluar dari nama variabel alih-alih menguraikannya atau B) mengembalikan seluruh string tanpa tersentuh?

cat > /etc/nginx/sites-available/default_php <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/$host; <--- $host is a problem child
}
END

Seperti, ketika saya selesai menyuntikkannya ke file yang tersisa dengan ini:

server {
    listen 80 default;
    server_name _;
    root /var/www/;
}
Xeoncross
sumber

Jawaban:

33

Dari bash(1)halaman manual:

Jika ada karakter dalam kata yang dikutip, pembatas adalah hasil dari penghapusan kutipan pada kata , dan garis-garis dalam dokumen di sini tidak diperluas.

cat > /etc/nginx/sites-available/default_php <<"END"
Ignacio Vazquez-Abrams
sumber
3
+1 Melewati "batas string" juga berfungsi ( \END). Lihat juga tldp.org/LDP/abs/html/here-docs.html#EX71C
John McCarthy
Kutipan tunggal juga berfungsi
Joao Costa
Mekanisme yang sama berlaku untuk Korn shell (ksh).
jhfrontz
19

Hanya dengan backslash:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END
Halfgaar
sumber
Apakah Anda tahu cara menonaktifkan injeksi nilai variabel tanpa melarikan diri masing-masing?
Xeoncross
2
Apa yang dikatakan Ignacio, tapi saya tidak tahu itu :)
Halfgaar