Introducción
Al escribir scripts de shell, puede encontrarse en una situación en la que necesite pasar un bloque de líneas de texto o código a un comando interactivo, como tee
, cat
o sftp
.
En Bash y otros shells como Zsh, un documento Here (Heredoc) es un tipo de redireccionamiento que le permite pasar múltiples líneas de entrada a un comando.
La sintaxis del script HereDoc tiene la siguiente forma:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- La primera línea comienza con un comando opcional seguido del operador de redireccionamiento especial
<<
y el identificador del delimitador. - Se puede utilizar cualquier cadena como identificador delimitador, los más utilizados son EOF o END.
- Si el 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.
- Al agregar un signo menos al operador de redireccionamiento
<<-
, se ignorarán todos los caracteres de las pestañas principales. Esto le permite usar sangría al escribir documentos aquí en scripts de shell. No se permite el espacio en blanco principal, solo la pestaña. - El bloque here-document 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 la herencia.
Heredoc se usa a menudo junto 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
usar un documento aquí.
cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Como puede ver en la siguiente salida, tanto la salida variable como la salida del comando se sustituyen:
The current working directory is: /home/noviello
You are logged in as: noviello
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
Se puede ver 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á usando un heredoc dentro de una declaración o bucle, use el operador de redireccionamiento <<-
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 la salida en la pantalla, puede redirigir a un archivo usando los 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á. Cuando si usa >
el archivo se sobrescribirá, mientras que con el operador >>
la salida se agregará al archivo.
La entrada Heredoc también se puede transportar. En el siguiente ejemplo, el sed
reemplazará todas las instancias del carácter l
con e
:
cat <<'EOF' | sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored
Para escribir los datos enviados en un archivo:
cat <<'EOF' | sed 's/l/e/g' > file.txt
Hello
World
EOF
Usando Heredoc con SSH
El uso de 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 utilice el delimitador sin comillas, asegúrese de evitar 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/noviello
The current remote working directory is: /home/user
También puede configurar la autenticación basada en claves SSH y conectarse a servidores Linux sin ingresar una contraseña.
Conclusión
En esta guía, aprendió qué heredoc
y cómo usarlo en scripts de shell.