Descriptores de archivo para stdin, stdout, y stderr

Tanto la entrada como la salida de texto en la línea de comandos de Linux son tratadas como un flujo o secuencia de caracteres. Hay tres tipos de flujos de E/S (Entrada y Salida), cuyo significado y uso ampliaremos durante el presente capítulo. Para representarlos más convenientemente, se utilizan números enteros conocidos como descriptores de archivo conocido. En este post explicaremos cuáles son esos secuencias de caracteres y mostraremos ejemplos ilustrativos sobre las mismas.

Stdin, stdout, y stderr: conceptos y descriptores de archivo

  • La entrada estándar (stdin, de Standard Input) consiste en los datos que son enviados al programa. En la mayoría de los casos, estos datos son ingresados mediante el teclado o son el resultado de la ejecución de un comando anterior. El descriptor de archivo asociado a stdin es el 0.
  • La salida estándar (stdout, de Standard Output) es la vía por la que el programa devuelve los datos luego de su ejecución. Por lo general, stdout es la pantalla de la computadora. El descriptor de archivo correspondiente es el 1.
  • El error estándar (stderr, de Standard Error) es el canal por el que se envía un mensaje de error en caso de que su ejecución falle. Si bien este mensaje generalmente también se visualizará por pantalla, es importante destacar que Linux permite distinguir entre stderr y stdout para manipular ambas secuencias de manera separada. El descriptor de archivo es el 2.

En la línea de comandos, es posible redirigir el resultado de la ejecución de un programa a un archivo. Podemos crear un archivo que previamente no existía al realizar la redirección. También, que podemos agregar a los  contenidos del archivo posteriormente.

Ejemplo

En el siguiente ejemplo vemos el uso de los operadores de redirección junto con los descriptores de archivo correspondientes a stdout y stderr. El comando ls -l /home /pruebas regresará un mensaje de error (debido a que el directorio /pruebas no existe) y el contenido de /home (que sí existe). Redirigiremos el stdout al archivo exito.txt y el stderr a error.txt:

ls -l /home /pruebas 1> exito.txt
ls -l /home /pruebas 2> error.txt
cat exito.txt
cat error.txt

El resultado de los comandos anteriores puede observarse en la Fig. 1:

Ejemplos del uso de los descriptores de archivo
Figura 1 – Ejemplos del uso de los descriptores de archivo

Espero que este post les haya resultado útil. ¡Nos leemos en breve!