Una introducción a la redirección de E/S en Linux

Introducción

Las capacidades de redirección integradas en Linux te proporcionan un conjunto robusto de herramientas para optimizar muchos flujos de trabajo. La “filosofía Unix” de desarrollo de software consistía en crear herramientas que hicieran una sola cosa bien, y esta filosofía se ha llevado adelante a las herramientas modernas de línea de comandos, que son poderosas individualmente y exponencialmente más poderosas cuando se combinan. Ya sea que estés escribiendo software complejo o simplemente trabajando en la línea de comandos, saber cómo manipular los diferentes flujos de entrada y salida en tu entorno aumentará enormemente tu productividad.

Prerrequisitos

Para seguir esta guía, necesitarás tener acceso a un servidor Linux. Si necesitas información sobre cómo conectarte a tu servidor por primera vez, puedes seguir nuestra guía sobre cómo conectarte a un servidor Linux usando SSH.

Flujos

La entrada y salida en el entorno de Linux se distribuyen en tres flujos. Estos flujos son:

  • entrada estándar (stdin)

  • salida estándar (stdout)

  • error estándar (stderr)

Los flujos también están numerados:

  • stdin (0)

  • stdout (1)

  • stderr (2)

Durante las interacciones estándar entre el usuario y la terminal, la entrada estándar proviene del teclado del usuario. La salida estándar y el error estándar se muestran en la terminal del usuario como texto. Colectivamente, los tres flujos se denominan flujos estándar.

Entrada Estándar

El flujo de entrada estándar típicamente lleva datos de un usuario a un programa. Los programas que esperan una entrada estándar generalmente reciben la entrada de un dispositivo, como un teclado. Más adelante en este tutorial, verás ejemplos de cómo utilizar la salida de un programa como Entrada Estándar para otro.

Salida Estándar

La salida estándar es la salida generada por un programa. Cuando el flujo de salida estándar no se redirige, emitirá texto directamente en la terminal. Intenta emitir algún texto arbitrario usando echo:

  1. echo Sent to the terminal
Output
Sent to the terminal

Cuando se utiliza sin opciones adicionales, el comando echo muestra cualquier argumento que se le pase en la línea de comandos.

Ejecuta echo sin ningún argumento:

  1. echo

Devolverá una línea vacía. Algunos programas no hacen nada sin argumentos proporcionados.

Error Estándar

El error estándar contiene errores generados por un programa que ha fallado de alguna manera. Al igual que la salida estándar, el destino predeterminado para este flujo es la pantalla de la terminal.

Vamos a ver un ejemplo básico de error estándar usando el comando ls. ls lista el contenido de un directorio.

Al ejecutarlo sin argumentos, ls lista el contenido dentro del directorio actual. Si se ejecuta ls con un directorio como argumento, listar el contenido del directorio proporcionado.

  1. ls %

Dado que % no es un directorio existente, esto enviará el siguiente texto al error estándar:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

Redirección de flujo

Linux incluye comandos de redirección para cada flujo. Estos se pueden usar para escribir la salida estándar o el error estándar en un archivo. Si escribe en un archivo que no existe, se creará un nuevo archivo con ese nombre antes de escribir.

Los comandos con un solo corchete sobrescriben el contenido existente del destino.

Sobrescribir

  • > – salida estándar

  • < – entrada estándar

  • 2> – error estándar

Los comandos con doble corchete no sobrescriben el contenido existente del destino.

Anexar

  • >> – salida estándar

  • << – entrada estándar

  • 2>> – error estándar

Tuberías

Las tuberías se utilizan para redirigir un flujo de datos de un programa a otro. Cuando la salida estándar de un programa se envía a otro a través de una tubería, la salida del primer programa se utilizará como entrada para el segundo, en lugar de imprimirse en la terminal. Solo se mostrarán los datos devueltos por el segundo programa.

La tubería en Linux se representa con una barra vertical: |

Aquí tienes un ejemplo de un comando que utiliza una tubería:

  1. ls | less

Esto toma la salida de ls, que muestra el contenido de tu directorio actual, y la redirige al programa less. Less muestra los datos que se le envían línea por línea.

ls normalmente muestra el contenido del directorio en varias filas. Cuando lo ejecutas a través de less, cada entrada se coloca en una nueva línea.

Aunque la funcionalidad de la tubería puede parecer similar a la de > y >>, la distinción es que las tuberías redirigen datos de un comando a otro, mientras que > y >> se utilizan exclusivamente para redirigir a archivos.

Filtros

Los filtros son una clase de programas que se utilizan comúnmente con la salida dirigida desde otro programa. Muchos de ellos también son útiles por sí solos, pero ilustran especialmente bien el comportamiento de redirección.

  • find – devuelve archivos cuyos nombres coinciden con el argumento pasado a find.

  • grep – devuelve texto que coincide con el patrón de cadena pasado a grep.

  • tee – redirige la entrada estándar tanto a la salida estándar como a uno o más archivos.

  • tr – encuentra y reemplaza una cadena por otra.

  • wc – cuenta caracteres, líneas y palabras.

Ejemplos

Ahora que has sido presentado a la redirección, la tubería y los filtros básicos, veamos algunos patrones y ejemplos comunes de redirección.

El patrón command > file redirige la salida estándar de un comando a un archivo.

  1. ls ~ > root_dir_contents.txt

El comando anterior pasa el contenido de tu directorio de inicio (~) como salida estándar, y escribe la salida en un archivo llamado root_dir_contents.txt. Eliminará cualquier contenido previo en el archivo, ya que es un comando de un solo corchete.

El patrón command > /dev/null redirige la salida estándar a ningún lugar. /dev/null es un archivo especial que se utiliza para desechar cualquier dato que se redirija a él. Se utiliza para descartar la salida estándar que no se necesita y que de otro modo podría interferir con la funcionalidad de un comando o un script. Cualquier salida que se envíe a /dev/null se descarta.

  1. ls > /dev/null

Este comando descarta el flujo de salida estándar devuelto por el comando ls al pasarlo a /dev/null.

Este patrón command 2> file redirige el flujo de error estándar de un comando a un archivo, sobrescribiendo el contenido existente.

  1. mkdir '' 2> mkdir_log.txt

Esto redirige el error generado por el nombre de directorio no válido '', y lo escribe en log.txt. Ten en cuenta que el error aún se envía a la terminal y se muestra como texto.

El patrón command >> file redirige la salida estándar de un comando a un archivo sin sobrescribir el contenido existente del archivo.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

Este par de comandos primero redirige la entrada de texto introducida por el usuario a través de echo a un nuevo archivo. Luego, añade el texto recibido por el segundo comando echo al archivo existente, sin sobrescribir su contenido.

El patrón command 2>> file anterior redirige el flujo de error estándar de un comando a un archivo sin sobrescribir el contenido existente del archivo. Este patrón es útil para crear registros de errores para un programa o servicio, ya que el archivo de registro no tendrá su contenido anterior borrado cada vez que se escriba en él.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

El comando anterior redirige el mensaje de error causado por un argumento de búsqueda inválido de find a un archivo llamado stderr_log.txt. Luego, agrega el mensaje de error causado por un argumento de wc inválido al mismo archivo.

El patrón command | command redirige la salida estándar del primer comando a la entrada estándar del segundo comando.

  1. find /var lib | grep deb

Este comando busca a través de /var y sus subcarpetas los nombres de archivo y extensiones que coinciden con la cadena deb, y devuelve las rutas de archivo para los archivos, con la porción coincidente en cada ruta resaltada en rojo.

El patrón command | tee file (que incluye el comando tee) redirige la salida estándar del comando a un archivo y sobrescribe su contenido. Luego, muestra la salida redirigida en la terminal. Crea un nuevo archivo si el archivo aún no existe.

En el contexto de este patrón, tee se usa típicamente para ver la salida de un programa mientras se guarda simultáneamente en un archivo.

  1. wc /etc/magic | tee magic_count.txt

Esto canaliza los recuentos de caracteres, líneas y palabras en el archivo /etc/magic (utilizado por el shell de Linux para determinar tipos de archivo) al comando tee, que luego divide la salida de wc en dos direcciones y la envía a la pantalla terminal y al archivo magic_count.txt. Para el comando tee, imagina la letra T. La parte inferior de la letra es los datos iniciales, y la parte superior es los datos que se dividen en dos direcciones diferentes (salida estándar y la terminal).

Se pueden usar múltiples tuberías para redirigir la salida a través de múltiples comandos y/o filtros.

Conclusión

Aprender cómo usar las capacidades de redireccionamiento incorporadas en la línea de comandos de Linux es una habilidad crucial. Ahora que has visto los conceptos básicos de cómo funcionan las redirecciones y las tuberías, podrás comenzar tu viaje en el mundo de la escritura de scripts de shell, que hace un uso frecuente de los programas y patrones resaltados en esta guía.

Buscar comandos específicos, o algo que te gustaría hacer en la línea de comandos (por ejemplo, “borrar todos los archivos en un directorio que comiencen con una letra mayúscula”) también puede resultar útil cuando necesites realizar una tarea específica usando la línea de comandos.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection