Introducción
Un documento aquí (HereDoc ) es una sección de código que actúa como un archivo separado. Un HereDoc es una cadena de varias líneas o un archivo literal para enviar flujos de entrada a otros comandos y programas.
HereDocs es especialmente útil cuando se redireccionan varios comandos a la vez, lo que ayuda a que los scripts de Bash sean más claros y fáciles de entender.
Este artículo le enseña los conceptos básicos del uso de la notación HereDoc y algunos casos de uso típicos.

Requisitos previos
- Acceso a la línea de comandos/terminal como usuario sudo.
- Un editor de texto para escribir scripts Bash.
- Comandos básicos de Linux. Para obtener una referencia rápida, obtenga nuestra hoja de trucos de comandos de Linux.
Sintaxis de Bash HereDoc
La sintaxis para escribir un HereDoc es:
[COMMAND] <<[-] 'DELIMITER'
Line 1
Line 2
...
DELIMITER
Consta de los siguientes elementos:
COMMAND
es opcional. Funciona para cualquier comando que acepte la redirección.<<
es el operador de redirección para reenviar un HereDoc alCOMMAND
.-
es un parámetro para la supresión de pestañas.DELIMITER
en la primera línea define un token delimitador HereDoc.END
,EOT
yEOF
son los más comunes, pero cualquier palabra de varios caracteres que no aparecerá en el cuerpo funciona. Omita las comillas simples en la primera línea para permitir la expansión de comandos y variables.- El
DELIMITER
en la última línea indica el final de un HereDoc. Utilice la misma palabra de la primera línea sin los espacios en blanco iniciales.
El HereDoc en sí contiene cualquier cantidad de líneas con cadenas, variables, comandos y otras entradas.
Ejemplos de Bash HereDoc
Esta sección muestra cómo usar la notación HereDoc en varias situaciones. El caso de uso más común es con el comando cat.
Cadena de varias líneas
Abre la terminal e ingresa el siguiente texto, presionando Enter después de cada línea:
cat << EOF
Hello
World
EOF

El cat
El comando lee HereDoc y escribe el contenido en la terminal.
Expansión de variables
Un HereDoc acepta el uso de variables y las lee.
Para ver cómo funciona esto, crea dos variables en la terminal:
var1="Hello"
var2="World"
Pase el HereDoc a un cat
comando para imprimir las dos variables junto con una variable de entorno:
cat << END
$var1
$var2
$PWD
END

Todas las variables se expanden y sus respectivos valores se imprimen en la terminal.
Expansión de comandos
HereDocs acepta la sustitución de comandos. Ejecute el siguiente código en la terminal línea por línea para ver los resultados:
cat << EOF
$(echo Hello)
$(whoami)
EOF

Abarque cada comando en $()
para evaluar una sentencia y obtener los resultados. Omitir $()
trata el texto como una cadena.
Ignorar expansión de variables y comandos
Agregue comillas simples o dobles al primer delimitador para ignorar la expansión de variables y comandos en un HereDoc.
Por ejemplo:
cat << "EOF"
$(echo Hello)
$(whoami)
$PWD
EOF

Agregar comillas al delimitador trata el contenido como un literal de HereDoc.
Conexión y redirección
Use tuberías o redirección para reenviar los resultados del comando a otro comando. Por ejemplo, cree un script Bash y agregue los siguientes contenidos para canalizar un comando:
#!/bin/bash
cat << EOF | base64 -d
SGVsbG8KV29ybGQK
EOF
Alternativamente, use la notación de redirección para lograr el mismo resultado:
#!/bin/bash
(base64 -d) < cat << EOF
SGVsbG8KV29ybGQK
EOF
Ejecute el script Bash para ver los resultados.

En ambos casos, la salida del cat
y un comando HereDoc canaliza (o redirige) a base64 -d
dominio. Como resultado, el script decodifica el mensaje de HereDoc.
Escribir en archivo
HereDoc permite escribir documentos de varias líneas a través de un comando.
Para crear un archivo y guardar el contenido de HereDoc, use el siguiente formato:
cat << EOF > hello_world.txt
Hello
World
EOF
Si el documento no existe, el comando lo crea. Verifique el contenido del archivo para confirmar:
cat hello_world.txt

La consola muestra el contenido del archivo.
Supresión de pestañas
Agregue un guión (-
) después de la redirección para suprimir las pestañas iniciales. Por ejemplo, cree y ejecute el siguiente script:
#!/bin/bash
cat <<- EOF
Hello
World
EOF

Sin supresión de tabulación, el mensaje se imprime en la consola con sangría. Agregar el guión elimina la sangría de tabulación y genera el mensaje sin los espacios iniciales.
Declaraciones internas y bucles
Cuando trabaje con un HereDoc dentro de sentencias y bucles, tenga en cuenta el siguiente comportamiento:
- Código dentro de sentencias y bucles está sangrado. Agregue un guión después del operador de redirección para imprimir mensajes de un HereDoc sin sangría.
- El delimitador final no puede tener espacios ni sangrías antes.
Pruebe el siguiente código de ejemplo para ver cómo usar un HereDoc dentro de una declaración if:
#!/bin/bash
if true;
then
cat <<- "END"
Hello
World
END
fi

El guión asegura que las sangrías no se muestren cuando se ejecuta el programa. El delimitador final no tiene sangría y agregar espacios provoca un error.
Comentarios de varias líneas
Un HereDoc con el comando null (:
) ) crea el efecto de bloquear comentarios en scripts de Bash.
Por ejemplo:
#!/bin/bash
: << 'END'
This is a comment
END
El uso de la notación HereDoc como un comentario de bloque no es convencional. En general, Bash no admite comentarios en bloque.
Personajes de escape
Para evitar la interpretación de caracteres, agregue una barra invertida (\
) antes de un caracter:
cat << EOF
\$100
EOF
Alternativamente, evite la interpretación de caracteres por completo escapando del delimitador:
cat << \EOF
$100
EOF
Usar comillas en el delimitador es equivalente en este caso.
Funciones
Agregue parámetros a una función enviando información a través de HereDoc. Por ejemplo, cree una función para leer líneas y agregar información a través de HereDoc:
#!/bin/bash
readLines(){
read greeting
read name
}
readLines << EOF
Hello
$USER
EOF
echo $greeting
echo $name
La función almacena la información proporcionada por HereDoc en variables.

Ejecute el script para imprimir los valores de las variables en el terminal.
HereDoc y SSH
Un HereDoc es conveniente para ejecutar múltiples comandos en una máquina remota. Pase un HereDoc a la conexión SSH para ejecutar varios comandos.
Por ejemplo:
ssh [email protected] << EOF
echo "Local user: $USER"
echo "Remote user: \$USER"
EOF

El comando imprime los usuarios locales y remotos en la consola.
HereDoc y SFTP
SFTP ayuda a transferir datos de forma segura a través del protocolo SSH. Reenvíe un HereDoc para ejecutar varios comandos SFTP automáticamente:
sftp [email protected] << EOF
put test.sh
EOF

El código carga un archivo de muestra en la máquina remota.