Usando el comando exec en Bash Shell Guiones

El comando exec integrado de shell se utiliza para ejecutar comandos en scripts de shell.

¡Esperar! No ejecute scripts de shell Linux comandos ya? Ellas hacen. Peroejecutivo ejecuta el Linux comandos sin iniciar un nuevo proceso. Reemplaza el proceso de shell con el comando especificado.

¿Parece complejo? Permítanme darles algunos ejemplos del uso del comando exec en scripts de shell:

  • Reemplazo de proceso
  • Iniciar sesión dentro del script de shell
  • Cambiar la entrada estándar para leer un archivo
  • Cambiar descriptores de archivo

Así que empecemos con el primero.

1. Use el comando exec para reemplazar el proceso en el script de shell

Reemplazar el proceso es una de las implementaciones más conocidas de exec en el script de shell.

Entonces, aquí usaré un script simple que mostrará cómo se puede usar el comando exec en el script para reemplazar el proceso de shell actual.

Primero, use el siguiente comando para usar el nano para crear y editar un nuevo script:

nano process_replacement.sh

Y pega lo siguiente:

#!/bin/bash

echo "Before exec: This is the original script"

exec ls -l

echo "After exec: This line will not be executed"

Una vez hecho esto, guarde los cambios y salga del editor de texto nano.

Ahora, déjame explicarte lo que hará este script.

Aquí hay tres instrucciones de comando. Primero imprimirá el texto básico que indica el script original que se pretende reemplazar.

La segunda declaración implica el uso del comando exec con el comando ls para enumerar el contenido del directorio de trabajo actual y también reemplazará el proceso anterior.

Ahora, la tercera declaración no se ejecutará ya que el proceso fue reemplazado por el exec anteriormente, y no hubo argumentos adicionales para respaldar la ejecución de la tercera declaración de comando.

En pocas palabras, el proceso será reemplazado por el segundo argumento de comando y el tercer comando no se ejecutará.

Y aquí está el resultado si ejecuta el script que se muestra:

Y como puede ver, aquí se muestra la tercera instrucción de comando que se suponía que debía imprimir “Después de ejecutar: esta línea no se ejecutará”.

Eso no parece muy práctico? Aquí está otro example.

2. Use el comando exec en los scripts de shell para iniciar sesión

Otra implementación interesante y fácil del exec es donde puede redirigir la salida a un archivo.

Aquí, usaré 3 argumentos, dos para la salida estándar y uno para el error estándar.

Aquí hay un guión:

#!/bin/bash

LOG_FILE="script.log"

# Redirect stdout and stderr to the log file
exec &> "$LOG_FILE"

# Start logging
echo "Script started at $(date)"

# Perform some operations
echo "Performing operation 1 (stdout)..."
ls -l /path/to/directory

echo "Performing operation 2 (stderr)..."
grep "search term" /path/to/nonexistentfile

echo "Performing operation 3 (stdout)..."
cat /path/to/file

# Log completion
echo "Script completed at $(date)"

He creado un archivo vacío llamadoscript.logen el mismo directorio donde se encuentra el script anterior para almacenar los registros.

Aquí, el comando exec redirigirá la salida al archivo de registro, incluido cuándo se inicia y finaliza.

Cuando ejecuté el script, el archivo que contenía el archivo de registro se veía así:

3. Cambie la entrada estándar para leer archivos usando exec

Esto puede ser muy útil al realizar ciertas operaciones sobre el archivo.

Aquí, usaré un archivo de texto simple llamadoHello.txtque contiene algunas líneas de texto aleatorias:

Ubuntu, openSUSE, Arch, Debian, Fedora
+ - / *
2 4 6 1
4 6 1 2

Y aquí está el script que leerá el archivo y enviará el contenido a la salida estándar:

#!/bin/bash

INPUT_FILE="Hello.txt"

# Redirect stdin to read from a file
exec < "$INPUT_FILE"

# Read the entire file as a single input
content=$(cat)

# Process the input
echo "Read: $content"

Ahora, déjame explicarte el guión.

  • INPUT_FILEespecifica de qué archivo leer.
  • exec < "$INPUT_FILE"es una redirección para leer desde el archivo especificado
  • content=$(cat)leerá todo el archivo de texto y lo asignará alcontentvariable.
  • echo "Read: $content"imprimirá el valor de lacontentvariable.

Y si ejecuta el script, el resultado se verá así:

use el comando exec en el script de shell para cambiar la entrada estándar para leer el archivo

4. Cambie los descriptores de archivo usando exec en el script de shell (avanzado)

Hay tres descriptores de archivo estándar en Linux:

  1. Entrada estándar (stdin – descriptor de archivo 0)
  2. Salida estándar (stdout – descriptor de archivo 1)
  3. Error estándar (stderr – descriptor de archivo 2)

Y usando el comando exec, puede cambiar los descriptores. Para examplepuede usar cualquier número para usar el flujo de datos preferido, como usar 3 para stdin.

Permítanme compartir el script primero y luego explicar cómo funciona:

#!/bin/bash

# Open a file for writing
exec 3> output.txt

# Redirect stdout to file descriptor 3
exec 1>&3

# Print some output
echo "This is a test message"

# Close the file descriptor
exec 3>&-

Aquí he abierto unoutput.txty el descriptor de archivo 3 asignado, lo que significa que todo lo que se envíe al descriptor de archivo 3 se escribirá en el archivo.

Usandoexec 1>&3He redirigido la salida estándar (1) al descriptor de archivo 3, lo que significa que todo lo que se escriba en la salida estándar se enviará al descriptor de archivo 3 (a la salida.txt en mi caso).

La declaración de eco imprime el texto en la salida estándar (que se enviará al archivo cuando cambiamos el descriptor de archivo anteriormente).

Yexec 3>&-elimina el descriptor de archivo 3 porque ya no es necesario.

Puede esperar los siguientes resultados después de ejecutar el script anterior:

Cambie los descriptores de archivo usando exec en el script de shell

Haga más emparejando exec con el comando de búsqueda

¿Sabías que puedes usar el comando de búsqueda con el ejecutivo y confía en mí, hace una combinación increíble?

Y si quieres aprender a hacerlo, aquí tienes una guía detallada:

Espero que encuentre útil esta guía. Y si tienes dudas, deja un comentario.

Actualizaciones del boletín

Ingrese su dirección de correo electrónico a continuación para suscribirse a nuestro boletín