Das sollte funktionieren, ich habe es gerade getestet und es hat wie erwartet funktioniert:Es hat keine Erweiterung, Substitution oder was-hast-du stattgefunden.
cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
curr=$((curr+406));
echo $curr > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want.
Folgendes funktioniert auch.
cat <<< ' > file
... code ...'
Beachten Sie auch, dass bei der Verwendung von Heredocs wie << EOF
, Substitution und Variablenexpansion und dergleichen stattfinden. Also etwas wie folgt machen:
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
führt immer zur Erweiterung der Variablen $HOME
und $PWD
. Wenn Ihr Home-Verzeichnis also /home/foobar
ist und der aktuelle Pfad ist /home/foobar/bin
, file
sieht so aus:
cd "/home/foobar"
echo "/home/foobar/bin"
statt wie erwartet:
cd "$HOME"
echo "$PWD"
Sie brauchen nur eine minimale Änderung; Setzen Sie das Here-Document-Trennzeichen nach <<
in einfache Anführungszeichen .
cat <<'EOF' >> brightup.sh
oder äquivalent Backslash-Escape:
cat <<\EOF >>brightup.sh
Ohne Anführungszeichen wird das Here-Dokument einer Variablensubstitution unterzogen, Backticks werden ausgewertet usw., wie Sie festgestellt haben.
Wenn Sie einige, aber nicht alle Werte erweitern müssen, müssen Sie diejenigen, die Sie verhindern möchten, einzeln maskieren.
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 produzieren
#!/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 aus der aktuellen Quelle zu lesen, bis eine Zeile zu sehen ist, die nur Trennzeichen (ohne abschließende Leerzeichen) enthält. Alle bis dahin gelesenen Zeilen werden dann als Standardeingabe für einen Befehl verwendet.
Das Format von Here-Dokumenten ist:
<<[-]word
here-document
delimiter
An Wort wird keine Parametererweiterung, Befehlsersetzung, arithmetische Erweiterung oder Pfadnamenerweiterung durchgeführt. Wenn Zeichen in Word in Anführungszeichen stehen, ist das Trennzeichen das Ergebnis der Entfernung von Anführungszeichen in Word, und die Zeilen im Hier-Dokument werden nicht erweitert. Wenn das Wort nicht in Anführungszeichen steht, werden alle Zeilen des Hier-Dokuments einer Parametererweiterung, Befehlsersetzung und arithmetischen Erweiterung unterzogen . Im letzteren Fall die Zeichenfolge \<newline>
wird ignoriert und \
muss verwendet werden, um die Zeichen \
in Anführungszeichen zu setzen , $
, und `
.