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

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"

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.