
Al trabajar con scripts bash, puede haber ocasiones en las que necesite procesar una serie de entradas con el mismo comando. Afortunadamente, hay una forma en Bash de hacer esto. para lograr de manera más óptima HierDoc.
HereDoc, acrónimo de Aquí documento, es una entrada Reenvío -Método para pasar múltiples entradas a un programa o comando. El concepto de Heredoc no se trata solo de bash. Muchos lenguajes de programación populares como Perl, Ruby, PHP admiten heredoc.
En este artículo, echamos un vistazo a la sintaxis y el uso de Heredoc con algunos casos prácticos de uso. Todos los ejemplos de este artículo se han creado para que sean sencillos, de modo que incluso un principiante pueda comprender fácilmente el concepto. Entremos y juguemos en Bash con Heredoc.
Sintaxis de HereDoc
El siguiente diagrama ilustra la sintaxis de Heredoc.
Aquí,
- mando – Cualquier comando (cat, wc, mail, etc.) que acepte redirecciones.
- Operador de desvío (
<<
) – El operador estándar para HereDoc es<<
. Reenvía el bloque de código al comando para su procesamiento. - Token separador – El separador marca el principio y el final del documento (bloque de código). El separador puede ser cualquier cosa, pero debería ser el mismo. Usualmente ves
EOF
se utiliza como separador, que significa «Fin del flujo de archivos».
Impresión de cadenas de varias líneas con HereDoc en Bash
Comencemos con un ejemplo simple de redirigir una cadena de varias líneas e imprimirla en la terminal.
los cat
El comando acepta un flujo de entrada y usa Heredoc, y puede redirigir el bloque de código para imprimirlo en la terminal.
$ cat << EOF Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
Producción:
Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <==
Eche un vistazo al fragmento de código de arriba. Tengo tres líneas que se redireccionan a eso. cat
Mando. yo suelo EOF
como separador. Sin embargo, puede usar cualquier cosa que desee, pero mantenga iguales los separadores de inicio y fin.
Probemos con otro ejemplo sencillo. Estoy dirigiendo el mismo redireccionamiento de tres líneas. El recuento de palabras Programa. Uso un separador diferente (BLK
) Aquí.
$ wc -l << BLK Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== BLK
Salida de muestra:
3
Reenvío y canalización en HereDoc
Puede combinar el operador de redirección de salida con Heredoc y redirigir la salida a un archivo en lugar de imprimirlo en la terminal.
Estoy usando el mismo ejemplo que usé en la sección anterior y redirigiendo la salida a un archivo llamado log_op.txt
.
$ cat << EOF > /tmp/log_op.txt Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
La salida de Heredoc se puede enviar al archivo. ser enviado tubo Operador para su posterior procesamiento.
$ cat << EOF | grep -i sla Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
Supresión de tabulaciones en HereDoc
Si su bloque de código contiene espacios (tabulaciones) y desea suprimirlos, use "-"
después del operador de redireccionamiento. Un punto importante es que solo se suprimen las pestañas, no los espacios.
Eche un vistazo al siguiente ejemplo. Agregué una declaración condicional al mismo ejemplo que vimos en las secciones anteriores. Las dos primeras líneas en Heredoc están tabuladas (4) y la tercera línea está espaciada (2).
if [[ $x = "err" ]] then cat <<- err_msg 1. Something is wrong with the input file received for today. 2. Contact the downstream team to get it corrected. 3. ==> SLA MISSED <== err_msg fi
Cuando se envíe el fragmento de código, mi salida se verá así.
1. Something is wrong with the input file received for today. 2. Contact the downstream team to get it corrected. 3. ==> SLA MISSED <==
Como puede ver, las tabulaciones se suprimen en la línea 1 y 2, pero no se suprimen en la línea 3 porque se utilizan espacios.
Variables y comandos en HereDoc
No es que solo pueda pasar cadenas dentro del bloque de código Heredoc. Puede pasar variables personalizadas y de entorno y ejecutar comandos dentro del bloque de código.
Eche un vistazo al siguiente ejemplo. Dentro del bloque de código tengo una variable personalizada "$AUTHOR"
, una variable de entorno "$SHELL"
, un comando externo "whoami"
.
Cuando se envía este fragmento, las variables y los comandos se expanden y luego se pasan al cat
Mando.
AUTHOR="OSTechNix" cat << EOF Author: $AUTHOR # USER DEFINED VARIABLE Article: Bash Heredoc I am using the $SHELL shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
Salida de muestra:
Author: OsTechnix Article: Bash Heredoc I am using the /bin/bash shell karthick
Puede encerrar el separador inicial entre comillas simples para suprimir la expansión dentro del bloque de código. De esa manera, todo lo que esté dentro del bloque de código se trata como literal de cadena.
cat << 'EOF'
Author: $AUTHOR # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the $SHELL shell # ENV VARIABLE
$(whoami) # EXTERNAL COMMAND
EOF
Salida de muestra:
Author: $AUTHOR Article: Bash Heredoc I am using the $SHELL shell $(whoami)
Como ya sabrá, Bash no admite comentarios de varias líneas. Con heredoc puede crear comentarios de varias líneas adjuntando el bloque de código al no-op
Comando (:
).
los no-op
está integrado en Bash, que acepta la entrada y devuelve el código de salida cero. Puedes pensar en esto como un sinónimo de bash incorporado «cierto» que también deja el código de salida cero.
: << 'COMMENTS' Author : OStechnix Article : Bash Heredoc BashV : 5.1.4 OS : PoP!_OS COMMENTS
Aviso: Casi todos los editores de texto tienen la capacidad de seleccionar varias líneas y permiten comentar o descomentar con solo presionar un botón. Es mejor seguir con este enfoque.
Escape de caracteres especiales en HereDoc
Los bloques de código pueden contener caracteres especiales. Si desea escapar de los caracteres especiales, hay algunas formas de hacerlo.
Puedes incluir el separador individual o comillas o Prefijo de barra invertida con el separador. De esta forma, se escapan todos los caracteres especiales.
# SINGLE QUOTES ESCAPE
cat << 'EOF'
I am using the $SHELL shell # ENV VARIABLE
$(whoami) # EXTERNAL COMMAND
EOF
# DOUBLE QUOTES ESCAPE
cat << "EOF"
I am using the $SHELL shell # ENV VARIABLE
$(whoami) # EXTERNAL COMMAND
EOF
# BACKSLASH ESCAPE
cat << EOF
I am using the $SHELL shell # ENV VARIABLE
$(whoami) # EXTERNAL COMMAND
EOF
En lugar de enmascarar todos los caracteres especiales, también puede enmascarar ciertos caracteres especiales dentro del bloque con un. Agregar barra invertida antes de cada carácter especial.
cat << EOF I am using the $SHELL shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
Salida de muestra:
I am using the $SHELL shell karthick
Caso de uso de HereDoc
Hasta ahora hemos visto la construcción central de Heredoc y sus usos básicos. Ahora veamos algunos casos de uso de la vida real. En mi experiencia, he usado Heredoc cuando trabajo con ssh y clientes de bases de datos donde necesito ejecutar un grupo de comandos.
Ejemplo 1: ejecutar como un usuario diferente dentro del script
En algunos casos, es posible que desee ejecutar ciertas partes de su código como un usuario diferente. En este caso, puede utilizar heredoc para redirigir los comandos para que se ejecuten bajo un usuario diferente.
Eche un vistazo al siguiente ejemplo. Estoy reenviando el bloque de código al su
Comando que permite al usuario «Ostechnix» y crea un archivo llamado prueba si no existe.
su - ostechnix << EOF if [[ ! -f /home/ostechnix/test ]];then touch /home/ostechnix/test echo "File Created" else echo "File exists" fi EOF
Ejemplo 2: Utilice HereDoc con DB Client
Cuando necesita ejecutar una serie de comandos en una base de datos, Heredoc es útil.
Eche un vistazo al siguiente ejemplo. Estoy interactuando con el cliente MongoDB. mongosh y dentro de Heredoc, se pasan comandos de bloque de código para crear una nueva base de datos, colección y agregar un documento de muestra.
mongosh << EOF use ostechnix db.data.insertOne( "Site" : "OsTechnix", "DB" : "Mongo" ) db.data.find().pretty() EOF
Puede que sepa o no sobre MongoDB, pero está bien. Esto es solo para mostrar cómo usar Heredoc para interactuar con clientes de base de datos. Puede usar cualquier cliente de base de datos como MySQL, psql, sqlite dependiendo de la base de datos con la que esté trabajando.
Ejemplo 3: ejecutar comandos remotos con HereDoc y SSH
Si desea ejecutar comandos a través del servidor remoto, puede usar heredoc en combinación con ssh
Mando. Usualmente usa ssh
Command le permite ejecutar comandos en el servidor remoto de la siguiente manera.
$ ssh [email protected] "command"
Deberá repetir el mismo comando una y otra vez para ejecutar comandos adicionales en el host remoto. Con heredoc puede agrupar y ejecutar todos los comandos.
$ ssh -T [email protected] << EOF Command 1... Command 2.. ..... Command N.. EOF
Si el mismo código debe ejecutarse en varios nodos, puede agregar for loop
junto con Heredoc. Estoy usando el mismo fragmento de creación de archivos que vimos en el primer ejemplo.
- La variable de matriz «servidor» contiene la lista de nombres de servidor.
- El bucle for itera sobre la variable de matriz.
- El comando para crear archivos se pasa al comando SSH, que itera en cada servidor y crea archivos. Asegúrate de agregar
-T
Indicador para el comando ssh, que desactiva la asignación de pseudo-terminal.
declare -a server=( host1 host2 host3 ) for host in $server[@] do ssh -T [email protected]$host << EOF echo "Running at host - $host" if [[ ! -f /home/ostechnix/test ]];then touch /home/ostechnix/test echo "File Created" else echo "File exists" fi EOF done
diploma
Heredoc es un concepto importante para comprender y utilizar en scripts bash. Escribir muchos guiones te enseñará más sobre Heredoc y las formas de aprovecharlo al máximo.
Si nunca antes ha usado Heredoc, inicie la Terminal y pruebe todos los fragmentos de código del artículo para comprenderlo mejor.