Sie brauchen nur eine minimale Änderung; Setzen Sie das Here-Document-Trennzeichen nach <<
.
cat <<'EOF' >> brightup.sh
oder gleichwertig Backslash-Escape:
cat <<\EOF >>brightup.sh
Ohne Anführungszeichen wird das Dokument hier variabel ersetzt, Backticks werden ausgewertet usw., wie Sie festgestellt haben.
Wenn Sie einige, aber nicht alle Werte erweitern müssen, müssen Sie die Werte, die Sie verhindern möchten, einzeln umgehen.
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
wird herstellen
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Wie von @fedorqui vorgeschlagen , ist hier der relevante Abschnitt von man bash
:
Hier Dokumente
Diese Art der Umleitung weist die Shell an, Eingaben von der aktuellen Quelle zu lesen, bis eine Zeile angezeigt wird, die nur ein Trennzeichen (ohne nachgestellte Leerzeichen) enthält. Alle bis zu diesem Punkt gelesenen Zeilen werden dann als Standardeingabe für einen Befehl verwendet.
Das Format der Here-Dokumente ist:
<<[-]word
here-document
delimiter
Für Word wird keine Parametererweiterung, Befehlssubstitution, arithmetische Erweiterung oder Pfadnamenerweiterung durchgeführt. Wenn Zeichen in Wörtern in Anführungszeichen gesetzt werden, ist das Trennzeichen das Ergebnis der Entfernung von Anführungszeichen in Word, und die Zeilen im Dokument hier werden nicht erweitert. Wenn das Wort nicht in Anführungszeichen gesetzt ist, werden alle Zeilen des hier beschriebenen Dokuments einer Parametererweiterung, einer Befehlssubstitution und einer arithmetischen Erweiterung unterzogen . Im letzteren Fall wird die Zeichenfolge \ ignoriert und \ muss verwendet werden, um die Zeichen \, $ und `in Anführungszeichen zu setzen.
#!/bin/bash
und nichts anderes sein - das#!
macht sie zu einer gültigen Shebang-Zeile, und was danach kommt, ist der Weg zum Dolmetscher.