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