En PC Resumen vamos a hablar en este artículo de la necesidad de redirigir resultados de la ejecución de un comando a diferentes lugares (Otros Scripts, programas, ficheros de texto, etc.).

Los descriptores de archivos

En Bash o cualquier otro lenguaje de comandos por shell en Linux, existen tres tipos de descriptores:

  • STDIN: Es la entrada estándar. Normalmente se utiliza para leer, viene de la entrada de datos por teclado de un terminal.
  • STDOUT: Es la salida estándar. Normalmente sirve para enviar los datos a la pantalla del terminal. Muestra los datos de un procedimiento normal y correcto según el resultado que se esperaba.
  • STDERR: Es la salida de errores estándar. Normalmente sirve para enviar los datos a la pantalla del terminal. Muestra los datos erróneos de un procedimiento cuando el resultado no es el esperado.

Cualquier script en Bash, hereda estos tres tipos de descriptores, haciendo así posible, la interacción con ellos por parte del programador o usuario.

¿Cómo enviar un STDOUT y STDERR a un archivo de texto?

A veces necesitamos enviar la salida "STDOUT" a un archivo y no a la pantalla del terminal, porque es muy grande para ver el resultado o porque nos interesa guardarlo al disco duro como un "log". Para enviar la salida "STDOUT" a un archivo usamos el comando ">" con lo que se sobreescribe el archivo si ya existe, o bien ">>" que solo añade el resultado de salida al final del archivo ya existente. Veamos un ejemplo de como se podría usar:

#!/bin/bash
# En este Script vamos a usar la entrada por teclado "STDIN" para ejecutar un comando y enviar por la salida estandar "STDOUT" a un fichero de texto el resultado.

echo "Indique un comando a realizar:"
read # Probemos de ejecutar el comando ls -lsh para guardar el resultado.
$REPLY >> resultado.txt

Si queremos que un proceso use su entrada estándar a partir de un archivo existente usamos "<". Veamos el siguiente ejemplo:

#!/bin/bash
# En este Script vamos a usar la entrada "STDIN" a partir de un fichero de texto con el comando ls -lsh y enviarlo por la salida estandar "STDOUT" a un fichero de texto el resultado.

read < lectura.txt # Lee el comando que hay dentro del fichero
$REPLY >> resultado.txt

Si queremos enviar la salida de errores "STDERR" a un archivo de texto. se hace igual que en la salida "STDOUT" pero usando los comandos "&>" o "&>>" según necesitemos. Veamos un ejemplo práctico:

#!/bin/bash
# En este Script vamos a usar la salida de errores "STDERR" haciendo fallar un comando que entraremos por teclado y lo guardaremos en un fichero de texto.

echo "Indique un comando a realizar:"
read # Probemos de ejecutar un comando que no existe. 
$REPLY &>> error.txt

Para enviar la salida de errores "STDERR" a la salida estándar "STDOUT" escribimos el comando "2>&1" y a la inversa que queremos enviar la salida estándar "STDOUT" a la de errores "STDERR" usamos el comando "1>&2".

Tuberías

Las tuberías se utilizan para enviar la salida de un comando o proceso como entrada de otro, esto a veces es necesario para completar una acción iniciada con un comando que debe ser completada con otro comando. Para usar las tuberías, solo se coloca el carácter "|" en la línea de comandos entre un programa y el otro. Este carácter se conoce como "pipe" en inglés. Veamos un ejemplo en el que se usa las "Tuberías":

#!/bin/bash
# En este Script vamos a hacer una tubería donde con el comando "top" y "grep" que nos permite buscar dentro de un archivo, las líneas que coinciden con un patron.
# Allí buscaremos el proceso de nuestro terminal "konsole" y guarde los datos en un fichero de resultado.

top | grep -e "konsole" >> resultado.txt

Con esto termina el artículo de "Redirecciones en Bash". En el próximo artículo hablaremos de los "Generalizadores en Bash". Esperamos que os haya ayudado nuestro artículo a entender el concepto de las redirecciones, si tenéis alguna duda podéis poneros en contacto con nosotros a través del formulario de la Web, o bien escribiendo un correo electrónico a Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo..

Pin It