Вам нужно только минимальное изменение; заключите в одинарные кавычки разделитель здесь-документа после <<
.
cat <<'EOF' >> brightup.sh
или, что то же самое, экранировать его:
cat <<\EOF >>brightup.sh
Без кавычек в данном документе будет произведена подстановка переменных, будут оцениваться обратные кавычки и т. Д., Как вы обнаружили.
Если вам нужно расширить некоторые, но не все, значения, вам нужно индивидуально избежать тех, которые вы хотите предотвратить.
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
будет производить
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Как предлагает @fedorqui , вот соответствующий раздел из man bash
:
Здесь документы
Этот тип перенаправления инструктирует оболочку читать ввод из текущего источника до тех пор, пока не будет видна строка, содержащая только разделитель (без завершающих пробелов). Все строки, прочитанные до этого момента, затем используются в качестве стандартного ввода для команды.
Формат здесь-документов:
<<[-]word
here-document
delimiter
Для слова не выполняется расширение параметров, подстановка команд, арифметическое расширение или расширение имени пути. Если какие-либо символы в слове заключены в кавычки, разделитель является результатом удаления кавычек в слове, и строки в данном документе не расширяются. Если слово не заключено в кавычки, все строки здесь-документа подвергаются расширению параметров, подстановке команд и арифметическому расширению . В последнем случае последовательность символов \ игнорируется, и необходимо использовать \ для заключения в кавычки символов \, $ и `.
#!/bin/bash
и ничего больше -#!
это то, что делает ее действительной строкой shebang, а то, что идет после нее, - это путь к интерпретатору.