ᛉ
  • ✦ infraestructura
    • ✦ linux
      • ✦ fundamentos
        • 📄 01_comandos_basicos_nivel_1
        • 📄 02_standard_streams_y_redireccion
      • ⟡ micro_labs
        • 📄 lab_01_navegacion_y_manipulacion
        • 📄 lab_021_fontaneria_de_datos
        • 📄 lab_02_fontaneria_de_datos
Descender a la Tierra
✦ Tipo: teoria-core
✧ Estado: 🟢 Completado
✥ Materia: cortex_core
🏷 Runas: #Linux
ᛞ

Descriptores de Archivo

Definición

En Unix/Linux todos los recursos exponen la misma interfaz (open, read, write, close via descriptores). Los descriptores de archivos son indices enteros positivos en una tabla llamada File Descriptor Table que lo tiene el kernel y el indice apunta a otra tabla llamada System-wide Open File Table que a su vez apunta a un archivo abierto (recursos de entradas y salidas) de un proceso, cada proceso tiene su propio conjunto de descriptores.

¿Cómo funciona?

Por defecto se reservan los 3 primeros descriptores (0, 1 y 2), donde:

DescriptorNombre estándarDirecciónUso
0stdin -> Standard InputentradaDonde el proceso o programa recibe la entrada, de un teclado por ejemplo
1stdout -> Standard OutputsalidaDonde el proceso o programa devuelve una salida sin errores, en la terminal o la pantalla, por ejemplo
2stderr -> Standard ErrorsalidaDonde el proceso o programa da el error, ya sea en la terminal o en la pantalla como ejemplo.

Operadores de Redirección

Definición

Los operadores de Redirección están muy ligados a los descriptores de archivos.

¿Cómo funciona?

Su deber es manipular dónde entra o dónde sale la información.

OperadorDirecciónDescriptorFunciónEjemplo
>Salida -> ArchivostdoutSobrescribe un archivo con el stdout, es decir sobrescribe con la salida al archivo, y naturalmente si no existe el archivo lo crea y escribe en él.echo "Hola" > salida.txt
>>Salida -> ArchivostdoutEscribe al final del archivo el stdout (salida) y si el archivo no existe lo crea y escribe en él.echo "Hola" >> salida.txt
<Archivo -> EntradastdinEste agrega stdin (Escribe) lo que esté en el archivo en la entrada del comando.
cat < nombre.txt<br />

Redirección de Errores

Esto es la redirección de errores, si bien se muestran en la terminal como una salida, esta es distinta, ya que es la salida de error.

OperadorDirecciónFunciónEjemplo
2>Salida de error -> ArchivoEste sobrescribe un archivo con el stderr, es decir si hay un error, este se encarga de tomar el error y guardarlo en el archivo.echo "Hola" 2> archivo_errores.txt
2>>Salida de error -> ArchivoEste escribe el error pero lo agrega al final del archivoecho "Mundo" 2>> archivo_errores.txt
2>&1Salida de error -> SalidaEste significa mandar la salida de error hacia donde está la salida normal,
básicamente en el ejemplo dice mandar la salida a hola.txt y mandar el error al mismo lugar al que mandas la salida normal (stdout). Es decir, con echo mandas “Hola” al stdout, y luego con > le dices que el stdout lo mande al archivo hola.txt y luego le dices que el stderr lo mandes a stdout, y stdout está en hola.txt así que se manda el error también al archivo hola.txt.
Ojo: el & indica que el siguiente argumento debe interpretarse como un descriptor de archivo y no como un nombre de archivo.
Por que del orden:
las redirecciones se leen de izquierda a derecha, es decir en el ejemplo dejamos primero el stdout apuntando a hola.txt y luego le decimos que el error tembien apunte…
en un orden distinto como ejemplo echo "Hola" 2>&1 hola.txt con esto apuntas el stderr hacia donde apunta el stdout, y si te fijas el stdout nunca cambio hacia donde apunta, por lo que no se ira a hola.txt
echo "Hola" > hola.txt 2>&1

/dev/null

En el directorio /dev se encuentran los dispositivos conectados, y cuando seleccionamos null estamos seleccionando un dispositivo vacío que es descartado al vacio por el softwere, es decir todos los datos que redirijas al archivo null serán descartados y desaparecerán.
Sirve para eliminar en estos casos:

¿Sirve para?RespuestaRazón
RedireccionesSíSon datos, y al tratar de escribir en null estos desaparecen instantáneamente
DatosSíTrata de escribir pero estos desaparecen
Para archivos completosNoNo puedes mover la estructura de datos de otro lugar hacia aqui para borrarlo
LecturaNoEste archivo siempre devuelve vacío
Escritura persistenteNoEste se va desapareciendo instantáneamente

Sobre cómo funciona esto exactamente a nivel de hardware está en [[character_device_driver]].

Tuberías (Pipes |)

Esto sirve para convertir el stdout de un comando en el stdin de otro, es decir funciona como una tubería de datos. Y usa la estructura básica de:
comando1 | comando2
Donde el stdout (Salida) del comando1 se convierte en el stdin (Entrada) del comando2.
El comando2 debe poder recibir stdin o no servirá de nada. Los comandos que sí reciben son los comandos que procesan texto. psdt: El comando echo ignora el stdin. Los pipes tienen un limite de buffer (espacio de memoria) si el comando1 la llena entonces se bloquea.

SIGPIPE

Cuando el comando2 (El que espera el stdin) termina entonces manda una senial llamada SIGPIPE que termina o cierra el comando1, de esa forma evita leer innecesariamente.

Procesos Hijo

en un comando con pipe, cada comando se ejecuta por separado en un subsell diferente, asi que las variables de entorno de un comando no afecta al comando del otro lado del pipe.

📝 Apuntes bajo CC BY 4.0 por Jhoel Villca.