GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo cat <<EOF>> un archivo que contiene código?

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 ` .


Linux
  1. ¿Cómo mover 100 archivos de una carpeta que contiene miles?

  2. ¿Cómo cambiar el nombre de un archivo en Linux?

  3. ¿Cómo funciona cat << EOF en bash?

  4. Cómo ordenar un archivo en el lugar

  5. ¿Cómo copiar un archivo transaccionalmente?

Cómo crear un archivo Tar Gz

Cómo descomprimir (abrir) un archivo Gz

Cómo crear un archivo en Linux usando el comando Cat

Cómo vincular un archivo en Linux

Cómo hacer eco en un archivo

Cómo editar código HTML en cPanel