Wie entkommt man Charakteren in Heredoc?

22

Ich arbeite mit einem Bash-Skript, um zu verhindern, dass es versucht, Variablen in meinem Heredoc zu ersetzen. Wie kann ein Heredoc eingestellt werden, um entweder A) die Variablennamen zu umgehen, anstatt sie zu analysieren, oder B) die gesamte Zeichenfolge unberührt zurückzugeben?

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

So wie es ist, wenn ich es in eine Datei eingefügt habe, habe ich folgendes übrig:

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

Antworten:

33

Von der bash(1)Manpage:

Wenn Zeichen in Wörtern in Anführungszeichen gesetzt werden, ist das Trennzeichen das Ergebnis der Entfernung von Anführungszeichen in Wörtern , und die Zeilen im Here-Dokument werden nicht erweitert.

cat > /etc/nginx/sites-available/default_php <<"END"
Ignacio Vazquez-Abrams
quelle
3
+1 Es funktioniert auch ( \END), wenn die "Grenzwertzeichenfolge" umgangen wird . Siehe auch tldp.org/LDP/abs/html/here-docs.html#EX71C
John McCarthy
Einfache Anführungszeichen funktionieren auch
Joao Costa
Der gleiche Mechanismus funktioniert für die Korn-Shell (ksh).
jhfrontz
19

Nur mit einem Backslash:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END
Halfgaar
quelle
Wissen Sie, wie Sie das Einfügen von Variablenwerten deaktivieren können, ohne die einzelnen Werte zu verlassen?
Xeoncross
2
Was Ignacio gesagt hat, aber das wusste ich nicht :)
Halfgaar