Как вы избегаете персонажей в heredoc?

22

Я работаю со скриптом bash, пытаясь помешать ему пытаться заменить переменные внутри моего heredoc. Как установить в heredoc либо A) экранирование имен переменных вместо их анализа, либо B) возврат всей строки без изменений?

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

Как и когда я заканчиваю вводить его в файл, мне остается следующее:

server {
    listen 80 default;
    server_name _;
    root /var/www/;
}
Xeoncross
источник

Ответы:

33

Со bash(1)страницы руководства :

Если какие-либо символы в слове заключены в кавычки, разделитель является результатом удаления кавычек в слове , а строки в документе здесь не раскрываются.

cat > /etc/nginx/sites-available/default_php <<"END"
Игнасио Васкес-Абрамс
источник
3
+1 Выход из «предельной строки» также работает ( \END). См. Также tldp.org/LDP/abs/html/here-docs.html#EX71C
Джон Маккарти
Одиночные кавычки тоже работают
Joao Costa
Тот же механизм работает для оболочки Korn (ksh).
Jhfrontz
19

Просто с обратной косой чертой:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END
Halfgaar
источник
Знаете ли вы, как отключить введение значений переменных без экранирования каждого из них?
Xeoncross
2
То, что сказал Игнасио, но я этого не знал :)
Halfgaar