Cómo usar "Documentos aquí" en Bash en Linux

Publicado: 2022-01-29
Una ventana de terminal en un sistema informático Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Los "documentos aquí" extrañamente llamados le permiten usar la redirección de entrada/salida dentro de los scripts de Bash en Linux. Son una excelente manera de automatizar los comandos que necesita ejecutar en una computadora remota.

Aquí Documentos

Muchos comandos en Linux tienen nombres de dos o tres letras. Esto es en parte lo que da lugar a la noción de que Linux es difícil de aprender y está lleno de comandos arcanos. Pero uno de los nombres más raros de Linux no es uno de los crípticamente cortos. “Aquí documentos” no son documentos, y tampoco está muy claro a qué se refiere “aquí”.

Son una construcción relativamente oscura, pero son útiles. Por supuesto, esto es Linux, por lo que hay más de una forma de despellejar a un gato. Algunas de las funciones proporcionadas por estos documentos se pueden reproducir de otras formas. Esos métodos alternativos suelen ser más complicados. En programación y secuencias de comandos, "más complicado" también significa "más propenso a errores" y que su código es más difícil de mantener.

Donde aquí los documentos realmente sobresalen es en la automatización de los comandos que desea enviar a una computadora remota desde una conexión establecida desde dentro de un script. Hacer la conexión es fácil, pero una vez que se ha hecho la conexión, ¿cómo "bombea" sus comandos desde su script al shell en la computadora remota? Aquí los documentos le permiten hacerlo de manera muy simple.

Principios básicos de los documentos Here

La representación idiomática de un documento aquí se ve así:

 COMANDO << cadena_límite
 .
 .
texto 
datos
Variables
.
.
límite_cadena
  • COMANDO : Este puede ser cualquier comando de Linux que acepte entrada redirigida. Tenga en cuenta que el comando echo no acepta entrada redirigida. Si necesita escribir en la pantalla, puede usar el comando cat , que lo hace.
  • << : El operador de redirección.
  • limit_string : Esta es una etiqueta. Puede ser lo que quieras siempre que no aparezca en la lista de datos que estás redirigiendo al comando. Se utiliza para marcar el final de la lista de texto, datos y variables.
  • Lista de datos : una lista de datos que se alimentarán al comando. Puede contener comandos, texto y variables. El contenido de la lista de datos se introduce en el comando una línea a la vez hasta que se encuentra _limit_string.
Anuncio publicitario

Probablemente verá ejemplos de documentos aquí que usan "EOF" como cadena de límite. No estamos a favor de ese enfoque. Funciona, pero "EOF" significa "Fin del archivo". Aparte del caso poco común en el que un documento de inicio es lo último en un archivo de script, "EOF" se usa de manera errónea.

Hará que sus scripts sean mucho más legibles si usa una cadena de límite que se refiera a lo que está haciendo. Si está enviando una serie de comandos a una computadora remota a través de Secure Shell (SSH), una cadena de límite llamada algo así como "_remote_commands" tendría perfecto sentido. No necesita comenzarlos con un carácter de subrayado " _ ". Hacemos eso porque los marca como algo fuera de lo común en su guión.

Ejemplos simples

Puede usar aquí documentos en la línea de comando y en scripts. Cuando escriba lo siguiente en una ventana de terminal, verá un mensaje de continuación de línea " > " cada vez que presione "Enter". Cuando escribe la cadena de límite "_end_of_text" y presiona "Enter", la lista de sitios web se pasa a cat, y se muestran en la ventana de la terminal.

 gato << _fin_de_texto 
Friki de cómo hacerlo 
Revisa Geek 
LifeSavvy 
TI con conocimiento de la nube
Rebote mental
_fin_de_texto 

Ese no es el ejercicio más valioso, pero demuestra que no se envía nada al comando hasta que se recopila la lista completa de datos y se encuentra la cadena límite. El comando cat no recibe ninguna entrada hasta que ingresa la cadena de límite "_end_of_text" y presiona la tecla "Enter".

Podemos hacer lo mismo en un script. Escriba o copie este ejemplo en un editor, guarde el archivo como "heredoc-1.sh" y cierre el editor.

 #!/bin/bash

gato << "_fin_de_texto"
Su nombre de usuario es: $(whoami)
Su directorio de trabajo actual es: $PWD
Su versión de Bash es: $BASH_VERSION
_fin_de_texto

A medida que siga este artículo, cada vez que cree un script, deberá hacerlo ejecutable antes de que se ejecute. En cada caso, utilice el comando chmod . Sustituya el nombre del script en cada ejemplo por el nombre del script utilizado aquí.

 chmod +x heredoc-1.sh 

Anuncio publicitario

Este script contiene dos variables de entorno, $PWD y $BASH_VERSION . Los nombres de las variables de entorno se reemplazan por sus valores de datos (el directorio de trabajo actual y la versión de Bash) cuando se ejecuta el script.

El script también utiliza la sustitución de comandos en el comando whoami . El nombre del comando se reemplaza por su propia salida. La salida de todo el script se escribe en la ventana del terminal mediante el comando cat. Ejecutamos el script llamándolo por su nombre:

 ./heredoc-1.sh 

Si modifica la secuencia de comandos y envuelve la cadena de límite en la primera línea del documento aquí entre comillas ” " “, la lista de datos se pasa al comando del documento aquí palabra por palabra. Se muestran los nombres de las variables en lugar de los valores de las variables, y la sustitución del comando no tener lugar.

 #!/bin/bash

gato <<- "_fin_de_texto"
Su nombre de usuario es: $(whoami)
Su directorio de trabajo actual es: $PWD
Su versión de Bash es: $BASH_VERSION
_fin_de_texto
 ./heredoc-1.sh 

Manejo de caracteres de tabulación

De manera predeterminada, los caracteres de tabulación en su lista de datos se conservarán y se escribirán en la ventana del terminal. Copie y guarde este ejemplo como "heredoc-2.sh". Hágalo ejecutable usando el comando chmod . Edite las líneas sangradas para asegurarse de que tengan uno o dos caracteres de tabulación al comienzo de la línea en lugar de una serie de espacios.

 #!/bin/bash

gato << _fin_de_texto
Su nombre de usuario es: $(whoami)
  Su directorio de trabajo actual es: $PWD
    Su versión de Bash es: $BASH_VERSION
_fin_de_texto
 ./heredoc-2.sh 

Las pestañas se escriben en la ventana del terminal.

Al agregar un guión " - " al operador de redirección, el documento aquí ignorará los caracteres de tabulación iniciales. Guarde este ejemplo como "heredoc-3.sh" y hágalo ejecutable.

 #!/bin/bash

gato <<- _fin_de_texto
Su nombre de usuario es: $(whoami)
  Su directorio de trabajo actual es: $PWD
    Su versión de Bash es: $BASH_VERSION
_fin_de_texto
 ./heredoc-3.sh 

Las pestañas se ignoran. Esto puede parecer trivial, pero es una buena manera de hacer frente a las pestañas principales debido a las secciones sangradas de las secuencias de comandos.

Anuncio publicitario

Los bucles y otras construcciones lógicas suelen estar sangrados. Si su documento aquí está contenido en una sección sangrada de una secuencia de comandos, el uso de un guión " - " con el operador de redirección elimina los problemas de formato causados ​​por los caracteres de tabulación iniciales.

 #!/bin/bash

si es verdad; entonces
  gato <<- _limit_string
  Línea 1 con una pestaña inicial.
  Línea 2 con una pestaña inicial.
  Línea 3 con una pestaña inicial.
  _limit_string
fi

Redirigir a un archivo

La salida del comando utilizado con el documento aquí se puede redirigir a un archivo. Utilice los operadores de redirección " > " (cree el archivo) o " >> " (cree el archivo si no existe, añádalo al archivo si existe) después de la cadena de límite en la primera línea del documento aquí.

Este script es "heredoc-4.sh". Redirigirá su salida a un archivo de texto llamado "session.txt".

 #!/bin/bash

cat << _fin_de_texto > sesión.txt
Su nombre de usuario es: $(whoami)
Su directorio de trabajo actual es: $PWD
Su versión de Bash es: $BASH_VERSION
_fin_de_texto
 ./heredoc-4.sh
 gato session.text 

Canalización de la salida a otro comando

La salida del comando utilizado en un documento aquí se puede canalizar como entrada a otro comando. Utilice la tubería “ | operador ” después de la cadena de límite en la primera línea del documento aquí. Vamos a canalizar la salida del comando here document, cat , a sed . Queremos sustituir todas las apariciones de la letra "a" con la letra "e".

Nombre este script "heredoc-5.sh".

 #!/bin/bash

gato << _fin_de_texto | sed 's/a/e/g'
Cómo
A
Gaak
_fin_de_texto
 ./heredoc-5.sh

"Gaak" se corrige a "Geek".

Envío de parámetros a una función

El comando que se usa con un documento here puede ser una función en el script.

Este script pasa algunos datos del vehículo a una función. La función lee los datos como si los hubiera escrito un usuario. Luego se imprimen los valores de las variables. Guarde este script como "heredoc-6.sh".

 #!/bin/bash

# la función set_car_details()
set_car_detalles ()
{
leer hacer
leer modelo
leer nuevo_usado
leer delivery_collect
leer ubicación
leer precio
}

# El documento here que pasa los datos a set_car_details()
set_car_detalles << _mars_rover_data
NASA
Rover de la perseverancia
Usado
Recoger
Marte (largo, lat) 77.451865,18.445161
2.2 mil millones
_mars_rover_data

# Recuperar los detalles del vehículo
echo "Hacer: $hacer"
echo "Modelo: $modelo"
echo "Nuevo o Usado: $nuevo_usado"
echo "Entrega o Recolección: $delivery_collect"
echo "Ubicación: $ubicación"
echo "Precio \$: $precio"
 ./heredoc-6.sh 

Los detalles del vehículo se escriben en la ventana del terminal.

Crear y enviar un correo electrónico

Podemos usar un documento aquí para redactar y enviar un correo electrónico. Tenga en cuenta que podemos pasar parámetros al comando delante del operador de redirección. Estamos usando el comando de mail de Linux para enviar un correo electrónico a través del sistema de correo local a la cuenta de usuario llamada "dave". La opción -s (asunto) nos permite especificar el asunto del correo electrónico.

Este ejemplo forma el script "heredoc-7.sh".

 #!/bin/bash

article="Aquí Documentos"

mail -s 'Estado de la carga de trabajo' dave << _project_report
Nombre de usuario: $(whoami)
Ha completado la tarea:
Artículo: $artículo
_informe del proyecto
 ./heredoc-7.sh 

Anuncio publicitario

No hay salida visible de este script. Pero cuando revisamos nuestro correo, vemos que el correo electrónico fue redactado, enviado y entregado.

 correo 

Uso de documentos Here con SSH

Aquí los documentos son una forma poderosa y conveniente de ejecutar algunos comandos en una computadora remota una vez que se ha establecido una conexión SSH. Si ha configurado claves SSH entre las dos computadoras, el proceso de inicio de sesión será completamente automático. En este ejemplo rápido y sucio, se le pedirá la contraseña de la cuenta de usuario en la computadora remota.

Este script es "heredoc-8.sh". Nos vamos a conectar a una computadora remota llamada “remote-pc”. La cuenta de usuario se llama "dave". Usamos la opción -T (deshabilitar asignación de pseudoterminal) porque no necesitamos que se nos asigne una pseudoterminal interactiva.

En la sección "haz algo de trabajo aquí" del script, podríamos pasar una lista de comandos, y estos se ejecutarían en la computadora remota. Por supuesto, podría simplemente llamar a un script que estaba en la computadora remota. El script remoto podría contener todos los comandos y rutinas que desea que se ejecuten.

Todo lo que hará nuestro script, heredoc-8.sh, es actualizar un registro de conexión en la computadora remota. La cuenta de usuario y un sello de fecha y hora se registran en un archivo de texto.

 #!/bin/bash

ssh -T [email protected] << _remote_commands

# trabaja un poco aquí

# actualizar el registro de conexión
echo $USUARIO "-" $(fecha) >> /home/dave/conn_log/script.log
_comandos_remotos
Anuncio publicitario

Cuando ejecutamos el comando, se nos solicita la contraseña de la cuenta en la computadora remota .

 ./heredoc-8.sh 

Se muestra cierta información sobre la computadora remota y regresamos al símbolo del sistema.

En la computadora remota , podemos usar cat para verificar el registro de conexión:

 gato conn_log/script.log 

Cada conexión se enumera para nosotros.

RELACIONADO: Cómo crear e instalar claves SSH desde el shell de Linux

Nombre extraño, características interesantes

Aquí los documentos son peculiares pero poderosos, especialmente cuando se usan para enviar comandos a una computadora remota. Sería muy sencillo crear una secuencia de comandos para una rutina de copia de seguridad usando rsync . Luego, el script podría conectarse a la computadora remota, verificar el espacio de almacenamiento restante y enviar un correo electrónico de alerta si el espacio se estaba agotando.

RELACIONADO: Cómo hacer una copia de seguridad de su sistema Linux con rsync