Quiero imprimir código en un archivo usando cat <<EOF >>
:
cat <<EOF >> brightup.sh
!/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
EOF
pero cuando verifico la salida del archivo, obtengo esto:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
Intenté poner comillas simples, pero la salida también lleva las comillas simples. ¿Cómo puedo evitar este problema?
#!/bin/bash
y nada más:#!
es lo que la convierte en una línea de shebang válida, y lo que viene después es el camino hacia el intérprete.man bash
y buscarHere Documents
. Todos los detalles ahí.$(command)
lugar de`command`
. Para obtener el contenido de un archivo, Bash tiene$(<file)
Respuestas:
Solo necesita un cambio mínimo; entre comillas simples el delimitador aquí-documento después
<<
.o equivalentemente barra invertida-escape:
Sin citar, el documento aquí se someterá a una sustitución de variables, se evaluarán las comillas inversas, etc., como descubrió.
Si necesita expandir algunos valores, pero no todos, debe escapar individualmente de los que desea evitar.
Producirá
Como sugirió @fedorqui , aquí está la sección relevante de
man bash
:fuente
O, utilizando sus marcadores EOF, debe citar el marcador inicial para que no se realice la expansión:
IHTH
fuente
Esto debería funcionar, solo lo probé y funcionó como se esperaba: no hubo expansión, sustitución o lo que sea.
Usar lo siguiente también funciona.
Además, vale la pena señalar que cuando se utilizan heredocs, tales como
<< EOF
, se lleva a cabo la sustitución y expansión de variables y similares. Entonces, haciendo algo como esto: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í:en lugar de lo esperado:
fuente
<<<
aquí solo están disponibles a partir de Bash 3, y no son portátiles a otros shells.<<<
también está disponible en Zsh