Al escribir scripts de shell, es posible que se encuentre en una situación en la que necesite pasar un bloque de texto o código de varias líneas a un comando interactivo, como tee
, cat
o sftp
.
En Bash y otros shells como Zsh, un documento Here (Heredoc) es un tipo de redirección que le permite pasar varias líneas de entrada a un comando.
La sintaxis para escribir HereDoc toma la siguiente forma:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- La primera línea comienza con un comando opcional seguido del operador de redirección especial
<<
y el identificador delimitador.- Puede utilizar cualquier cadena como identificador delimitador, los más utilizados son EOF o END.
- Si el identificador delimitador no está entre comillas, el shell sustituirá todas las variables, comandos y caracteres especiales antes de pasar las líneas del documento aquí al comando.
- Adición de un signo menos al operador de redirección
<<-
, hará que se ignoren todos los caracteres de tabulación iniciales. Esto le permite usar sangría al escribir documentos aquí en scripts de shell. No se permiten caracteres de espacio en blanco iniciales, solo tabulación.
- El bloque del documento aquí puede contener cadenas, variables, comandos y cualquier otro tipo de entrada.
- La última línea termina con el identificador delimitador. No se permiten espacios en blanco delante del delimitador.
Ejemplos básicos de Heredoc #
En esta sección, veremos algunos ejemplos básicos de cómo usar heredoc.
Heredoc se usa con más frecuencia en combinación con el comando cat.
En el siguiente ejemplo, estamos pasando dos líneas de texto que contienen una variable de entorno y un comando a cat
usando un documento aquí.
cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Como puede ver en la salida a continuación, tanto la variable como la salida del comando se sustituyen:
The current working directory is: /home/linuxize
You are logged in as: linuxize
Veamos qué sucederá si encerramos el delimitador entre comillas simples o dobles.
cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Puede notar que cuando se cita el delimitador, el shell no realiza la expansión de parámetros ni la sustitución de comandos.
The current working directory is: $PWD
You are logged in as: $(whoami)
Si está utilizando un heredoc dentro de una declaración o bucle, use el <<-
operación de redirección que le permite sangrar su código.
if true; then
cat <<- EOF
Line with a leading tab.
EOF
fi
Line with a leading tab.
En lugar de mostrar el resultado en la pantalla, puede redirigirlo a un archivo usando el >
, >>
operadores.
cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Si el archivo.txt no existe, se creará. Al usar >
el archivo se sobrescribirá, mientras que el >>
agregará la salida al archivo.
La entrada heredoc también se puede canalizar. En el siguiente ejemplo, sed
El comando reemplazará todas las instancias de l
carácter con e
:
cat <<'EOF' | sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored
Para escribir los datos canalizados en un archivo:
cat <<'EOF' | sed 's/l/e/g' > file.txt
Hello
World
EOF
Usando Heredoc con SSH #
Usar Heredoc es una de las formas más convenientes y fáciles de ejecutar múltiples comandos en un sistema remoto a través de SSH.
Cuando use un delimitador sin comillas, asegúrese de escapar de todas las variables, comandos y caracteres especiales; de lo contrario, se interpolarán localmente:
ssh -T [email protected] << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: \$PWD"
EOF
The current local working directory is: /home/linuxize
The current remote working directory is: /home/user
También puede configurar una autenticación basada en clave SSH y conectarse a sus servidores Linux sin ingresar una contraseña.
Conclusión #
En esta guía, ha aprendido qué es heredoc
y cómo usarlo en sus scripts de shell.
Si tiene alguna pregunta o comentario, no dude en dejar un comentario.