Comment échappez-vous aux personnages de heredoc?

22

Je travaille avec un script bash essayant de l'empêcher de tenter de remplacer des variables dans mon heredoc. Comment définir un hérédoc sur A) échappe-t-il aux noms de variables au lieu de les analyser ou B) retourne-t-il la chaîne entière intacte?

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

En l'état, quand j'ai fini de l'injecter dans un fichier, je me retrouve avec ceci:

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

Réponses:

33

Depuis la bash(1)page de manuel:

Si des caractères dans word sont cités, le délimiteur est le résultat de la suppression des guillemets sur word et les lignes du document ici ne sont pas développées.

cat > /etc/nginx/sites-available/default_php <<"END"
Ignacio Vazquez-Abrams
la source
3
+1 Échapper à la "chaîne limite" fonctionne également ( \END). Voir aussi tldp.org/LDP/abs/html/here-docs.html#EX71C
John McCarthy
Les guillemets simples fonctionnent aussi
Joao Costa
Le même mécanisme fonctionne pour le shell Korn (ksh).
jhfrontz
19

Juste avec une barre oblique inverse:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END
Halfgaar
la source
Savez-vous comment désactiver l'injection de valeurs de variable sans échapper à chacune?
Xeoncross
2
Ce qu'Ignacio a dit, mais je ne le savais pas :)
Halfgaar