Esto debería funcionar, acabo de probarlo y funcionó como se esperaba:no se llevó a cabo ninguna expansión, sustitución o lo que sea.
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.
Usar lo siguiente también funciona.
cat <<< ' > file
... code ...'
Además, vale la pena señalar que al usar heredocs, como << EOF
, tiene lugar sustitución y expansión variable y similares. Así que haciendo algo como esto:
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
siempre resultará en la expansión de las variables $HOME
y $PWD
. Entonces, si su directorio de inicio es /home/foobar
y la ruta actual es /home/foobar/bin
, file
se verá así:
cd "/home/foobar"
echo "/home/foobar/bin"
en lugar de lo esperado:
cd "$HOME"
echo "$PWD"
Solo necesitas un cambio mínimo; comillas simples el delimitador del documento aquí después de <<
.
cat <<'EOF' >> brightup.sh
o equivalentemente barra invertida-escapar:
cat <<\EOF >>brightup.sh
Sin citar, el documento aquí se someterá a una sustitución de variables, se evaluarán los acentos graves, etc., como descubrió.
Si necesita expandir algunos valores, pero no todos, debe escapar individualmente los que desea evitar.
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
producirá
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Como sugirió @fedorqui, aquí está la sección relevante de man bash
:
Aquí Documentos
Este tipo de redirección le indica al shell que lea la entrada de la fuente actual hasta que se vea una línea que contiene solo el delimitador (sin espacios en blanco). Todas las líneas leídas hasta ese punto se usan como entrada estándar para un comando.
El formato de los documentos aquí es:
<<[-]word
here-document
delimiter
No se realiza ninguna expansión de parámetros, sustitución de comandos, expansión aritmética o expansión de nombre de ruta en Word. Si algún carácter de word está entre comillas, el delimitador es el resultado de la eliminación de comillas en word y las líneas del documento aquí no se expanden. Si la palabra no está entrecomillada, todas las líneas del documento aquí están sujetas a expansión de parámetros, sustitución de comandos y expansión aritmética . En este último caso, la secuencia de caracteres \<newline>
se ignora y \
debe usarse para citar los caracteres \
, $
y `
.