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/;
}

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"

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.