Vous n'avez besoin que d'un changement minime; guillemet simple le délimiteur ici-document après <<
.
cat <<'EOF' >> brightup.sh
ou de manière équivalente contre la barre oblique inverse:
cat <<\EOF >>brightup.sh
Sans les guillemets, le document ici subira une substitution de variables, les backticks seront évalués, etc., comme vous l'avez découvert.
Si vous devez développer certaines valeurs, mais pas toutes, vous devez échapper individuellement à celles que vous souhaitez empêcher.
cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF
produira
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Comme suggéré par @fedorqui , voici la section pertinente de man bash
:
Ici Documents
Ce type de redirection demande au shell de lire l'entrée de la source actuelle jusqu'à ce qu'une ligne contenant uniquement un délimiteur (sans espace de fin) soit vue. Toutes les lignes lues jusqu'à ce point sont ensuite utilisées comme entrée standard pour une commande.
Le format des documents ici est:
<<[-]word
here-document
delimiter
Aucun développement de paramètre, substitution de commande, développement arithmétique ou développement de chemin n'est effectué sur le mot. Si des caractères du mot sont entre guillemets, le délimiteur est le résultat de la suppression des guillemets sur mot et les lignes du document ici ne sont pas développées. Si le mot n'est pas entre guillemets, toutes les lignes du document ici sont soumises à l'expansion des paramètres, à la substitution de commandes et à l'expansion arithmétique . Dans ce dernier cas, la séquence de caractères \ est ignorée et \ doit être utilisée pour citer les caractères \, $ et `.
#!/bin/bash
et rien d'autre -#!
c'est ce qui en fait une ligne shebang valide, et ce qui vient après est le chemin vers l'interpréteur.