Você só precisa de uma mudança mínima; apóie o delimitador here-document após <<
.
cat <<'EOF' >> brightup.sh
ou de forma equivalente barra invertida com escape:
cat <<\EOF >>brightup.sh
Sem citar, o aqui documento sofrerá substituição de variáveis, crases serão avaliados, etc, como você descobriu.
Se você precisar expandir alguns, mas não todos os valores, será necessário escapar individualmente daqueles que deseja evitar.
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
vai produzir
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Conforme sugerido por @fedorqui , aqui está a seção relevante de man bash
:
Aqui Documentos
Este tipo de redirecionamento instrui o shell a ler a entrada da fonte atual até que uma linha contendo apenas o delimitador (sem espaços em branco à direita) seja vista. Todas as linhas lidas até esse ponto são então usadas como entrada padrão para um comando.
O formato dos documentos aqui é:
<<[-]word
here-document
delimiter
Nenhuma expansão de parâmetro, substituição de comando, expansão aritmética ou expansão de nome de caminho é executada na palavra. Se algum caractere da palavra estiver entre aspas, o delimitador é o resultado da remoção da citação na palavra, e as linhas do here-document não são expandidas. Se a palavra não estiver entre aspas, todas as linhas do here-document estão sujeitas a expansão de parâmetro, substituição de comando e expansão aritmética . No último caso, a seqüência de caracteres \ é ignorada e \ deve ser usada para citar os caracteres \, $ e `.
#!/bin/bash
e nada mais -#!
isso é o que a torna uma linha shebang válida, e o que vem depois dela é o caminho para o intérprete.