¿Cómo escapas de los personajes en heredoc?

22

Estoy trabajando con un script bash tratando de evitar que intente reemplazar variables dentro de mi heredoc. ¿Cómo configurar un heredoc para A) escapar de los nombres de las variables en lugar de analizarlos o B) devolver toda la cadena intacta?

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

Como es, cuando termino de inyectarlo en un archivo, me queda esto:

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

Respuestas:

33

Desde la bash(1)página del manual:

Si se citan caracteres en palabras , el delimitador es el resultado de la eliminación de comillas en palabras , y las líneas en el documento aquí no se expanden.

cat > /etc/nginx/sites-available/default_php <<"END"
Ignacio Vazquez-Abrams
fuente
3
+1 Escapar de la "cadena de límite" también funciona ( \END). Ver también tldp.org/LDP/abs/html/here-docs.html#EX71C
John McCarthy
Las comillas simples también funcionan
Joao Costa
El mismo mecanismo funciona para el shell Korn (ksh).
jhfrontz
19

Solo con una barra invertida:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END
Halfgaar
fuente
¿Sabes cómo deshabilitar la inyección de valores variables sin escapar de cada uno?
Xeoncross
2
Lo que dijo Ignacio, pero no lo sabía :)
Halfgaar