Cómo funciona la redirección de E/S de Linux (entrada / salida)

Publicidad

Uno de los temas más importantes e interesantes de la administración de Linux es la redirección de E/S.

Esta característica de la línea de comandos le permite redireccionar la entrada y/o salida de comandos y/o archivos, o unir varios comandos juntos usando tuberías para formar lo que se conoce como “pipeline de comandos”.

Todos los comandos que ejecutamos fundamentalmente producen dos tipos de salida:

  1. El resultado del comando: datos que el programa está diseñado para producir.
  2. El estado del programa y los mensajes de error que informan al usuario de los detalles de la ejecución del programa.

En Linux y otros sistemas similares a Unix, hay tres archivos predeterminados nombrados a continuación que también son identificados por el shell usando números de descriptor de archivo:

  1. stdin o 0 – está conectado al teclado, la mayoría de los programas leen la entrada de este archivo.
  2. stdout o 1 – se adjunta a la pantalla, y todos los programas envían sus resultados a este archivo.
  3. stderr o 2 – los programas envían mensajes de estado/error a este archivo que también se adjunta a la pantalla.

Por lo tanto, la redirección de E/S le permite alterar la fuente de entrada de un comando, así como a dónde se envían sus mensajes de salida y de error. Esto es posible gracias a los operadores de redirección “<” y “>”.

Se puede redirigir la salida estándar como en el ejemplo a continuación, aquí queremos almacenar la salida del comando para una inspección posterior:

Publicidad

Top -bn 5> top.log

Donde las opciones:

-b: permite que la parte superior se ejecute en modo por lotes, de modo que pueda redirigir su salida a un archivo u otro comando.

-n – especifica el número de iteraciones antes de que termine el comando.

Puede ver el contenido del archivo top.log utilizando el comando cat de la siguiente manera:

Cat top.log

Para añadir la salida de un comando, utilice el operador “>>”.

Por ejemplo, para añadir la salida del comando superior en el archivo top.log, especialmente dentro de un script (o en la línea de comandos), ingrese la siguiente línea:

Top -bn 5 >> top.log

Utilizando el número de descriptor de archivo, el comando de redireccionamiento de salida anterior es el mismo que:

Top -bn 5 1> top.log

Ahora, para redirigir el error estándar de un comando, debe especificar de forma detallada el número de descriptor de archivo para que el shell entienda lo que está intentando hacer.

Por ejemplo, el comando ls siguiente producirá un error cuando sea ejecutado por un usuario normal del sistema sin privilegios de root:

Ls -l / root /

Puede redirigir el error estándar a un archivo como se muestra a continuación:

Ls -l / root / 2> ls-error.log

Cat ls-error.log

Para anexar el error estándar, utilice el siguiente comando:

Ls -l / root / 2 >> ls-error.log

También es posible capturar toda la salida de un comando (salida estándar y error estándar) en un solo archivo. Esto se puede hacer de dos maneras posibles especificando los números de descriptor de archivo:

  1. El primero es un método relativamente antiguo que funciona de la siguiente manera:

Ls -l / root /> ls-error.log 2> & 1

El comando anterior significa que el shell enviará primero la salida del comando ls al archivo ls-error.log (usando> ls-error.log) y luego escribe todos los mensajes de error en el descriptor de archivo 2 (salida estándar), el cual ha sido redirigido al archivo ls-error.log (usando 2> & 1).

Implicando que el error estándar también se envía al mismo archivo que la salida estándar.

  1. El segundo y método directo es:

Ls -l / root / &> ls-error.log

También puede añadir salida estándar y error estándar a un solo archivo como:

Ls -l / root / & >> ls-error.log