GNU/Linux >> Tutoriales Linux >  >> Linux

Redirección de Bash explicada con ejemplos

La redirección y la canalización son dos funciones útiles en las secuencias de comandos de bash que los administradores de sistemas y los desarrolladores usan con frecuencia. En esta guía, discutiremos qué es Bash Redirection y cómo trabajar con Redirección en Bash con comandos de ejemplo.

Antes de comprender cómo funciona la redirección, es importante saber qué es el descriptor de archivo.

¿Qué es un descriptor de archivo?

Cuando abre un archivo en Linux, a cada archivo se le asigna un número entero y esta información se almacena en el kernel. De esta forma, el núcleo sabe qué archivos están abiertos y qué proceso ha abierto los archivos. El número entero asignado es lo que llamamos descriptor de archivo (abreviado FD).

De manera predeterminada, cada programa comenzará con tres descriptores de archivo.

  • FD 0 -> Entrada estándar (stdin) -> Teclado
  • FD 1 -> Salida estándar (Stdout) -> Pantalla (Terminal)
  • FD 2 -> Error estándar (Stderr) -> Pantalla (Terminal)

Puede ver los descriptores de archivo en /dev directorio:

$ ls -l /dev/std*
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stdout -> /proc/self/fd/1

Stdin (FD0) recibe información del teclado. stdout (FD1) y stderr (FD2) se envían al terminal. Al usar Canalizaciones y redirecciones, puede cambiar la forma en que se pasa la entrada y a dónde se envían los errores y la salida.

Redireccionar la salida a un archivo

Como se indicó anteriormente, la salida (stdout) y el error (stderr) de cualquier programa se envían a la terminal. Puede usar el operador de redirección ">” para escribir stdout y stderr en un archivo.

Eche un vistazo al siguiente ejemplo. Estoy ejecutando uname -mrs comando y redirigir la salida a un archivo llamado uname.log .

$ uname -mrs > uname.log
$ cat uname.log
Linux 5.10.0-8-amd64 x86_64

Aviso: Al usar ">" operador, si el archivo no está disponible, se creará. Y si el archivo ya existe, se anulará con nuevos contenidos.

También puede usar el número de descriptor de archivo para stdout(1) antes del operador de redirección para redirigir la salida a un archivo.

$ uname -mrs 1> uname.log

Como ya mencioné, un único operador de redirección (> ) solo anulará el contenido de un archivo, si el archivo ya existe. Sin embargo, si desea agregar el contenido en lugar de sobrescribirlo en el mismo archivo, use el operador de redirección doble (es decir, >> ). También puede usar el descriptor de archivo stdout (1) aquí también.

$ whoami >> uname.log
$ echo $SHELL 1>> uname.log
$ cat uname.log
Linux 5.10.0-8-amd64 x86_64
ostechnix
/bin/bash

Cómo manejar Stderr

Cada programa genera tanto salida como error y ambos se envían al terminal. En muchos casos, es posible que desee ignorar el error o aislar los errores y redirigirlo a un archivo separado para solucionar el problema.

Tomemos un ejemplo simple de ejecutar el ls comando para ver cómo funciona esto. Estoy tratando de enumerar dos archivos de los cuales solo uno está presente. Recibo tanto mi error como mi salida en la terminal como ya dije.

$ ls -l uname.log u1.log
ls: cannot access 'u1.log': No such file or directory
-rw-r--r-- 1 ostechnix ostechnix 48 Aug 27 07:37 uname.log

Estoy ejecutando el mismo ls comando de nuevo, pero esta vez redirigiendo la salida a un archivo. Como puede ver en la salida > El operador redirige stdout(1) a un archivo pero stderr(2) se envía a la terminal.

$ ls -l uname.log u1.log > ls.op
ls: cannot access 'u1.log': No such file or directory

Para redirigir stderr a un archivo, use "2>" operador. Es obligatorio usar el descriptor de archivo para stderr(2) antes del operador de redirección> que enviará el error solo a un archivo.

$ ls -l uname.log u1.log > ls.op 2> ls.err
$ cat ls.err
ls: cannot access 'u1.log': No such file or directory

Ahora, stdout y stderr se escriben en archivos separados. También puede enviar stdout y stderr a un solo archivo.

$ ls -l uname.log u1.log 1> ls.op 2> ls.op

Desde bash 4.4 , también puede usar &> firmar para redirigir tanto stdout como stderr a un archivo.

$ ls -l uname.log u1.log &> ls.op

¿Qué es /dev/null?

Null es un archivo especial de caracteres que acepta entradas y descarta las entradas y no produce ninguna salida. En pocas palabras, null descarta cualquier cosa que le redirijas.

$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Aug 27 06:01 /dev/null

¿Por qué importa el valor nulo en la redirección? Usted podría preguntarse. En algunos casos, es posible que desee no imprimir ni almacenar stdout o stderr. En ese caso, puede redirigir stdout o stderr a /dev/null, lo que descartará el flujo de entrada.

$ date > /dev/null
$ date 1> /dev/null    # Stdout to Null
$ dateee 2> /dev/null  # WRONG COMMAND, Stderr to Null
$ date &> /dev/null    # Stdout/Stderr to Null

Redireccionamiento de entrada en Bash

De manera similar a cómo está redirigiendo la salida y el error a un archivo, también puede pasar entradas a un comando usando el operador de redirección de entrada (< ).

Comencemos con un programa simple de conteo de palabras. Aquí, estoy redirigiendo el contenido de ostechnix.txt archivo al conteo de palabras para encontrar el número de líneas.

$ wc -l < ostechnix.txt 
10

También puede pasar el descriptor de archivo stdin (0) al redirigir la entrada.

$ wc -l 0< ostechnix.txt 
10

Puede combinar los operadores de redirección de entrada y salida como se muestra a continuación.

$ wc -l < ostechnix.txt &> /tmp/wc.op
$ cat /tmp/wc.op 
10

La redirección de entrada se utilizará junto con un bucle while para leer el contenido de un archivo línea por línea.

Eche un vistazo al siguiente ejemplo. Estoy pasando el /etc/passwd archivo como entrada al while dominio. Aquí el read El comando leerá línea por línea y lo almacenará en la variable VAL y más abajo en el bucle se escribe la condición para verificar si el usuario está disponible.

while read VAL; do   
  NAME=$(echo $VAL | awk -F  ":" '/1/ {print $1}' )
  if [[ $NAME = "karthick" ]]
  then
   echo "User spotted"
  fi
done < /etc/passwd

Un script para encontrar el usuario del sistema

Reemplace "karthick" en el código anterior con el nombre de usuario de su sistema. Guarde el archivo y ciérrelo.

Esta no es una forma óptima de lograr la tarea de encontrar al usuario, pero con fines de demostración, será suficiente.

Ahora, haga que el script sea ejecutable y ejecútelo:

$ chmod +x ostechnix.sh 
$ ./ostechnix.sh 
User spotted

Bash admite otra forma de redirección de entrada conocida como Heredoc . Para obtener más detalles, consulte la siguiente guía:

  • Tutorial de Bash Heredoc para principiantes

Resumen

En esta guía, aprendimos algunos conceptos importantes de secuencias de comandos, como qué es la redirección de Bash, qué es el descriptor de archivo, cómo redirigir una salida a un archivo, cómo manejar stderr, qué es /dev/null y cómo se usa en Bash redirección, y finalmente terminamos la guía con Redirección de entrada en Bash.

Si desea aprender a escribir scripts en Bash, debe aprender y familiarizarse con los conceptos que se explican aquí. Para que te sientas cómodo, te sugiero que pruebes todos los comandos que hemos mostrado en este artículo en tu sistema.

Si tiene algún comentario o sugerencia que ayude a la comunidad de Linux y a nuestros lectores a aprender a ejecutar bash, no dude en hacérnoslo saber en la sección de comentarios a continuación.

Lectura sugerida:

  • Secuencias de comandos de Bash:variables explicadas con ejemplos
  • Bash Scripting:funciones explicadas con ejemplos
  • Secuencias de comandos de Bash:bucle For explicado con ejemplos
  • Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos
  • Comando Bash Echo explicado con ejemplos en Linux
  • La lista de atajos de teclado Bash útiles
  • Diferencia entre la definición de variables Bash con y sin exportación

Linux
  1. Cómo escribir un script Bash con ejemplos

  2. Tutorial de Bash HereDoc con ejemplos

  3. Comando Linux cksum explicado para principiantes (con ejemplos)

  4. Declaración de Bash If-Else con ejemplos

  5. Cómo crear y montar el sistema de archivos Btrfs (explicado con ejemplos)

Bash Scripting - Comando Printf explicado con ejemplos

Bash Scripting:matriz asociativa explicada con ejemplos

Bash Scripting:matriz indexada explicada con ejemplos

Comando Tr en Linux explicado con ejemplos

Permisos y propiedad de archivos de Linux explicados con ejemplos

Bash Script for Loop explicado con ejemplos