Como você escapa personagens no heredoc?

22

Estou trabalhando com um script bash tentando impedi-lo de tentar substituir variáveis ​​dentro do meu heredoc. Como definir um heredoc para A) escapar dos nomes das variáveis ​​em vez de analisá-los ou B) retornar a string inteira intocada?

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

Como é, quando eu termino de injetá-lo em um arquivo, fico com isso:

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

Respostas:

33

Na bash(1)página do manual:

Se algum caractere no word for citado, o delimitador é o resultado da remoção de aspas no word e as linhas no documento aqui não são expandidas.

cat > /etc/nginx/sites-available/default_php <<"END"
Ignacio Vazquez-Abrams
fonte
3
Escapar da "string de limite" também funciona ( \END). Veja também tldp.org/LDP/abs/html/here-docs.html#EX71C
John McCarthy
Aspas simples trabalhar muito
João Costa
O mesmo mecanismo funciona para o shell Korn (ksh).
Jhfrontz #
19

Apenas com uma barra invertida:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END
Halfgaar
fonte
Você sabe como desativar a injeção de valores de variáveis ​​sem escapar de cada um?
Xeoncross
2
O que Ignacio disse, mas eu não sabia que :)
Halfgaar