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

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"

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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.