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

Я работаю со скриптом 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/;
}

3 ответа

Решение

От bash(1) справочная страница:

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

cat > /etc/nginx/sites-available/default_php <<"END"

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

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END

@Xeoncross (и все это попадает сюда через результаты поисковых систем): можно отключить подстановку переменных, заключив стоп-токен в одинарные кавычки:

      cat > /tmp/boeboe << 'END'
server {
    listen 80 default;
    server_name _;
    root /var/www/$host;
}

# Example : here is another occurrence of '$host' which won't be substituted either
# When single-quoting the stop token, you don't have to escape all '$myVariable' anymore
END
Другие вопросы по тегам