Hay una característica un tanto oscura en los shells de Linux y Unix que le permite abrir una especie de bucle do-while para el comando cat. Se llama heredoc , y te permite tener, más o menos, un editor de texto sin importar qué shell estés usando. La sintaxis es:
$ cat << EOF >> example.txt
La cadena en el medio es, esencialmente, un condicional que detiene el ciclo. Es decir, si escribe solo en una línea, el ciclo termina. Durante el bucle, todo lo que escriba en su terminal se canaliza al archivo de destino (en este caso).
Instalando
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
Siempre que tenga una terminal, ya tiene la capacidad de iniciar un heredoc. He usado este truco sintáctico en Bash, tsch y Korn shell.
Uso de heredoc
Para abrir una "sesión" de heredoc, usa el comando cat con redirección que apunta primero a cat con una cadena de terminación (la convención común es EOF para "Fin del archivo", pero en realidad puede ser cualquier cosa). Después de la palabra clave de terminación, redirige su salida a un archivo de destino. Luego, puede escribir directamente en su terminal, utilizando los atajos de teclado de shell más comunes para navegar a través de su trabajo. Su sesión finaliza cuando escribe su cadena de terminación designada en una sola línea. Sabrá que está en un bucle heredoc por el mensaje único (generalmente el > personaje).
$ cat << EOF >> example.txt
> Everything you type here will be placed into example.txt when I type EOF on a line by itself. Until then, you can type...
>
> whatever...
>
> you want to type.
>
> EOF
$
Todo lo que ingresas mientras tu terminal espera EOF se coloca en el archivo de destino. Se omiten los caracteres de indicación y EOF en sí no forma parte del archivo.
Everything you type here will be placed into example.txt when I type EOF on a line by itself. Until then, you can type...
whatever...
you want to type.
Siendo realistas, probablemente no vaya a utilizar la sintaxis de heredoc como sustituto de un buen editor de texto. Es un gran truco rápido para ingresar más de una línea, pero más de 10 líneas comienzan a agotar su utilidad. Por ejemplo, no puede subir para editar líneas anteriores sin activar la función de historial de su shell. Dependiendo de su caparazón y de cómo esté configurado, es posible que pueda subir, luego bajar para recuperar su texto y luego retroceder a través de su texto con Ctrl+B .
La mayoría de las funciones de su shell funcionan como se espera, pero probablemente no haya deshacer y muy poca recuperación de errores.
Y además, es probable que incluso la instalación más mínima tenga al menos Vi o ed instalado.
¡Y, sin embargo, heredoc sigue siendo útil! Es más flexible que echo , y cuando trabaja en un script de shell, es indispensable. Por ejemplo, imagine que está escribiendo un script de instalación para que pueda automatizar la instalación de un conjunto de aplicaciones personalizadas. Una de las aplicaciones no se distribuye con .dekstop
archivo, por lo que no aparece en el menú de la aplicación. Para solucionar esto, decide generar un .desktop
archivo en el momento de la instalación.
En lugar de escribir un .desktop
y llevarlo como una dependencia externa para su secuencia de comandos de instalación, puede usar heredoc en su propia secuencia de comandos de instalación:
#!/bin/sh
VERSION=${VERSION:-x.y.z}
PKGNAM=${VERSION:-example}
PKG="${PKGNAM}"-"${VERSION}"-`arch`.tgz
# download package
wget "${PKG}"
tar txvf "${PKG}"
# use here doc to create missing .desktop file
cat << EOF >> $HOME/.local/share/applications/example.desktop
[Desktop Entry]
Version=1.0
Type=Application
Name="${PKGNAM}"
Comment="${PKGNAM}"
Exec="${PKGNAM}" %F
EOF
# insert the rest of an install script...
Ha automatizado la entrada de texto en un archivo, sin editor de texto involucrado (excepto el que usa para escribir su script, obviamente). Esto es lo que resulta .desktop
el archivo se parece a:
[Desktop Entry]
Version=1.0
Type=Application
Name=example
Comment=example
Exec=example %F
Como puede ver, puede usar variables dentro de heredoc y se resuelven correctamente. El EOF
la cadena no aparece en el archivo; solo señala el final del heredoc.
Mejor que eco
La técnica heredoc generalmente se considera más fácil que echo
o printf porque una vez que estás "en" el documento, eres libre de hacer lo que quieras. Es liberador en ese sentido, pero es limitado en comparación con un editor de texto adecuado.
Use heredoc para notas rápidas y scripts de shell, y nunca más se pregunte cómo generar archivos de configuración de forma dinámica.