Dovrebbe funzionare, l'ho appena provato e ha funzionato come previsto:nessuna espansione, sostituzione o altro.
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.
Anche l'uso di quanto segue funziona.
cat <<< ' > file
... code ...'
Inoltre, vale la pena notare che quando si utilizzano heredoc, come << EOF
, sostituzione ed espansione variabile e simili hanno luogo. Quindi, facendo qualcosa del genere:
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
risulterà sempre nell'espansione delle variabili $HOME
e $PWD
. Quindi se la tua home directory è /home/foobar
e il percorso corrente è /home/foobar/bin
, file
avrà questo aspetto:
cd "/home/foobar"
echo "/home/foobar/bin"
invece del previsto:
cd "$HOME"
echo "$PWD"
Hai solo bisogno di un cambiamento minimo; virgoletta singola il delimitatore here-document dopo <<
.
cat <<'EOF' >> brightup.sh
o equivalentemente barra rovesciata:
cat <<\EOF >>brightup.sh
Senza virgolette, il documento here subirà la sostituzione di variabili, gli apici inversi saranno valutati, ecc., come hai scoperto.
Se devi espandere alcuni valori, ma non tutti, devi eseguire l'escape individualmente a quelli che desideri impedire.
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
produrrà
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Come suggerito da @fedorqui, ecco la relativa sezione da man bash
:
Qui Documenti
Questo tipo di reindirizzamento istruisce la shell a leggere l'input dalla sorgente corrente finché non viene vista una riga contenente solo un delimitatore (senza spazi vuoti). Tutte le righe lette fino a quel punto vengono quindi utilizzate come input standard per un comando.
Il formato degli here-documents è:
<<[-]word here-document delimiter
Nessuna espansione di parametro, sostituzione di comando, espansione aritmetica o espansione di percorso viene eseguita su word. Se dei caratteri in word sono quotati, il delimitatore è il risultato della rimozione delle virgolette su word e le righe nel documento qui non vengono espanse. Se la parola non è quotata, tutte le righe dell'here-document sono soggette a espansione di parametri, sostituzione di comandi ed espansione aritmetica . In quest'ultimo caso, la sequenza di caratteri
\<newline>
viene ignorato e\
deve essere utilizzato per citare i caratteri\
,$
e`
.