Jak uciekasz przed bohaterami w heredoc?

22

Pracuję ze skryptem bash, który próbuje powstrzymać go przed próbą zastąpienia zmiennych wewnątrz mojego heredoc. Jak ustawić heredoc na A) unikanie nazw zmiennych zamiast ich analizowania lub B) zwracanie nietkniętego całego łańcucha?

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

Gdy skończyłem wstrzykiwanie go do pliku, pozostaje mi to:

server {
    listen 80 default;
    server_name _;
    root /var/www/;
}
Xeoncross
źródło

Odpowiedzi:

33

Ze strony podręcznika bash(1):

Jeśli cytowane są jakiekolwiek znaki w słowie , separator jest wynikiem usunięcia cudzysłowu w słowie , a wiersze w niniejszym dokumencie nie są rozwijane.

cat > /etc/nginx/sites-available/default_php <<"END"
Ignacio Vazquez-Abrams
źródło
3
+1 Ucieczka od „łańcucha ograniczającego” również działa ( \END). Zobacz także tldp.org/LDP/abs/html/here-docs.html#EX71C
John McCarthy
Działa także pojedyncze cytaty
Joao Costa
Ten sam mechanizm działa dla powłoki Korna (ksh).
jhfrontz
19

Tylko z odwrotnym ukośnikiem:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END
Halfgaar
źródło
Czy wiesz, jak wyłączyć wstrzykiwanie wartości zmiennych bez uciekania przed każdą z nich?
Xeoncross,
2
Co powiedział Ignacio, ale tego nie wiedziałem :)
Halfgaar,