Hai solo bisogno di un minimo cambiamento; virgolette singole il delimitatore here-document dopo <<
.
cat <<'EOF' >> brightup.sh
o equivalentemente backslash-escape:
cat <<\EOF >>brightup.sh
Senza citare, il here document subirà la sostituzione delle variabili, verranno valutati i backtick, ecc. Come hai scoperto.
Se è necessario espandere alcuni valori, ma non tutti, è necessario sfuggire individualmente a quelli che si desidera impedire.
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
produrrà
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Come suggerito da @fedorqui , ecco la sezione pertinente da man bash
:
Qui documenti
Questo tipo di reindirizzamento indica alla shell di leggere l'input dalla sorgente corrente finché non viene visualizzata una riga contenente solo delimitatore (senza spazi finali). Tutte le righe lette fino a quel punto vengono quindi utilizzate come input standard per un comando.
Il formato di here-documents è:
<<[-]word
here-document
delimiter
Nessuna espansione dei parametri, sostituzione dei comandi, espansione aritmetica o espansione del percorso viene eseguita sulla parola. Se vengono citati caratteri in una parola, il delimitatore è il risultato della rimozione delle virgolette sulla parola e le righe nel documento qui non vengono espanse. Se la parola non è quotata, tutte le righe del here-document sono soggette all'espansione dei parametri, alla sostituzione dei comandi e all'espansione aritmetica . In quest'ultimo caso, la sequenza di caratteri \ viene ignorata e \ deve essere utilizzata per citare i caratteri \, $ e `.
#!/bin/bash
e nient'altro:#!
è ciò che la rende una linea di shebang valida e ciò che viene dopo è il percorso dell'interprete.