Предотвращать bash от интерпретации без цитирования всего

Мне нужно вывести текст как bash script, но в script. Для этого я использую кошку, но у нее есть один недостаток. Он интерпретирует переменные и прочее во время написания. Я хочу предотвратить это.

Как сделать это без цитирования всех varibles (мой script длинный с ошибкой)? Пример

cat >/tmp/script << EOF
  $HOSTNAME
  # lots of other stuff I do NOT want to escape like \$VARIABLE
  # ...
EOF

cat /tmp/script
myhostname.mylan

Я хочу:

cat /tmp/script
$HOSTNAME

Изменить: Обратите внимание, что мой script (здесь только $HOSTNAME) очень длинный, я не хочу его менять. Также одиночное цитирование не работает с < lt;

cat >/tmp/script '<< EOF
  $HOSTNAME
EOF'
File not found: EOF'

Какой трюк? Спасибо.

Ответ 1

Если вы хотите, чтобы все было процитировано:

cat << 'EOF'
stuff here with $signs is OK
as are `backquotes`
EOF

См. раздел "Здесь документы" в руководстве.

Ответ 2

Побег в $:

cat >/tmp/script << EOF
  \$HOSTNAME
EOF

Ответ 3

Использовать sed:

 sed -n '20,30p' "$0" 

для печати строк с 20 по 30, SSCE:

#!/bin/bash
cat >/dev/null << EOF
 3
 4 $HOSTNAME
 5 ls 
 6 $(ls -l) 
 7
 8 echo 'foo
 9 bar' 
 10
 11 echo "Foo
 12 $((4+4)) Bar" 
EOF
sed -n '3,12p' "$0"
echo "fine?"

работа с головкой/хвостом тоже должна работать.

Вам придется корректировать числа, если вы работаете над ним и вставляете или удаляете строки.

Ответ 4

Попробуйте с эхом:

echo '
$HOSTNAME
...
' >> /tmp/script