Вам потрібні лише мінімальні зміни; одинарними лапками розділювач тут документа після <<
.
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
і нічим іншим -#!
це те, що робить його дійсним рядком шебанга, а те, що настає після нього, - це шлях до перекладача.