Redirección de flujos de datos

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En Linux, la redirección es una función poderosa que te permite controlar hacia dónde van la entrada y la salida de los comandos. Es posible que hayas visto operadores como > o >> en laboratorios anteriores. Estos se utilizan para redirigir la salida a archivos. Este laboratorio te presentará el concepto de redirección y te guiará a través de varios ejemplos prácticos, adecuados para principiantes sin conocimientos previos de Linux.

Redirección básica de salida

Comencemos con los conceptos básicos de la redirección de salida:

  1. Abre tu terminal. Debes estar en el directorio /home/labex/project. Si no estás seguro, puedes escribir pwd (print working directory, imprime el directorio de trabajo) para verificar tu ubicación actual.

  2. Crearemos un nuevo archivo llamado redirect con algún contenido. Escribe el siguiente comando:

    echo 'hello labex' > redirect

    Este comando hace dos cosas:

    • echo 'hello labex' imprime el texto "hello labex"
    • El símbolo > redirige esta salida a un archivo llamado redirect

    Si el archivo no existe, se creará. Si ya existe, su contenido se sobrescribirá.

  3. Ahora, agreguemos más contenido al mismo archivo:

    echo 'labex.io' >> redirect

    El operador >> es similar a >, pero en lugar de sobrescribir el archivo, agrega el nuevo contenido al final del archivo existente.

  4. Para ver el contenido del archivo que acabamos de crear y modificar, usa el comando cat:

    cat redirect

    Deberías ver ambas líneas que agregamos al archivo: "hello labex" en la primera línea y "labex.io" en la segunda línea.

Comprender la entrada, salida y error estándar

Antes de profundizar en la redirección, entendamos tres conceptos importantes:

  1. Entrada estándar (stdin): Esta es la fuente de entrada predeterminada, generalmente tu teclado. Es donde el sistema espera que provenga la entrada.
  2. Salida estándar (stdout): Este es el destino de salida predeterminado, generalmente tu pantalla. Es donde el sistema envía la salida normal.
  3. Error estándar (stderr): Aquí es donde se envían los mensajes de error, también generalmente a tu pantalla. Está separado de stdout para permitir que los mensajes de error se manejen de manera diferente si es necesario.

En Linux, estos se representan mediante descriptores de archivo, que son simplemente números que representan archivos abiertos:

Descriptor de archivo Archivo de dispositivo Descripción
0 /dev/stdin stdin
1 /dev/stdout stdout
2 /dev/stderr stderr

Veamos un ejemplo de cómo podemos usar estos:

  1. Primero, creemos un nuevo directorio llamado Documents:

    mkdir Documents

    Este comando crea un nuevo directorio. Si obtienes un error que dice que el directorio ya existe, está bien, significa que puedes usar el existente.

  2. Ahora, creemos un archivo C en este directorio:

    cat > Documents/test.c << EOF
    #include <stdio.h>
    
    int main()
    {
        printf("hello world\n");
        return 0;
    }
    EOF

    Este comando hace algunas cosas:

    • cat > inicia el proceso de escritura en un archivo
    • Documents/test.c es el archivo en el que estamos escribiendo
    • << EOF le dice a la shell que siga aceptando entrada hasta que vea "EOF" (End Of File, Fin de Archivo)
    • Las líneas intermedias son el contenido que estamos escribiendo en el archivo
    • El EOF final marca el final de la entrada
  3. Ahora, veamos el contenido de este archivo:

    cat Documents/test.c

    Deberías ver el código C que acabamos de crear.

Redirigiendo el error estándar

Ahora, exploremos cómo redirigir el error estándar:

  1. Intenta leer dos archivos, uno que existe y otro que no:

    cat Documents/test.c nonexistent.c

    Verás el contenido de test.c (que existe) y un mensaje de error para nonexistent.c (que no existe). El contenido de test.c se envía a stdout, mientras que el mensaje de error se envía a stderr.

  2. Ahora, redirigamos la salida estándar a un archivo y el error estándar a otro archivo:

    cat Documents/test.c nonexistent.c > output.log 2> error.log

    Este comando hace varias cosas:

    • cat Documents/test.c nonexistent.c intenta mostrar el contenido de ambos archivos
    • > output.log redirige stdout (descriptor de archivo 1) a un archivo llamado output.log
    • 2> error.log redirige stderr (descriptor de archivo 2) a un archivo llamado error.log
  3. Ve el contenido de ambos archivos:

    echo "Output log:"
    cat output.log
    echo "Error log:"
    cat error.log

    Deberías ver el contenido de test.c en output.log y el mensaje de error sobre nonexistent.c en error.log.

Combinando la salida estándar y el error estándar

A veces, es posible que desees redirigir tanto la salida estándar como el error estándar al mismo archivo. Esto es especialmente útil cuando quieres capturar toda la salida de un comando, ya sea salida normal o mensajes de error.

  1. Intentemos listar el contenido de nuestro directorio actual y de un directorio que no existe en un solo comando:

    ls -l. nonexistent_directory > combined_output.log 2>&1

    Este comando hace varias cosas:

    • ls -l. lista el contenido del directorio actual
    • nonexistent_directory es un intento de listar un directorio que no existe
    • > combined_output.log redirige stdout a un archivo llamado combined_output.log
    • 2>&1 redirige stderr al mismo lugar que stdout (que en este caso es combined_output.log)
  2. Ahora, veamos el contenido de nuestro archivo de salida combinada:

    cat combined_output.log

    Deberías ver tanto la lista del directorio como el mensaje de error sobre el directorio que no existe en este archivo.

  3. Hay una forma abreviada de redirigir tanto stdout como stderr al mismo archivo en bash:

    ls -l. nonexistent_directory &> another_combined_output.log

    El operador &> es equivalente a > file 2>&1.

  4. Veamos el contenido de este nuevo archivo:

    cat another_combined_output.log

    Deberías ver la misma salida que en el archivo anterior.

Usos avanzados de /dev/null

El dispositivo /dev/null, a menudo llamado "cubo de bits" o "agujero negro", es un archivo especial que descarta todos los datos escritos en él. Tiene varias aplicaciones útiles en la escritura de scripts de shell y en las operaciones de la línea de comandos.

  1. Suprimir la salida de un comando:
    Ya hemos visto cómo suprimir la salida estándar:

    ls -l > /dev/null

    Y cómo suprimir tanto la salida estándar como el error estándar:

    ls -l nonexistent_directory > /dev/null 2>&1
  2. Suprimir solo los mensajes de error:
    A veces, quieres ver la salida pero no los mensajes de error:

    ls -l. nonexistent_directory 2> /dev/null

    Deberías ver la lista del directorio, pero no el error sobre el directorio que no existe.

  3. Usar /dev/null como un archivo vacío:
    /dev/null se puede usar como entrada de un archivo vacío. Esto es útil para comandos que requieren un archivo de entrada pero no quieres proporcionar ninguna entrada real. Por ejemplo:

    grep "pattern" /dev/null

    Este comando no producirá ninguna salida porque /dev/null es un archivo vacío.

  4. Probar la existencia de un archivo:
    Puedes usar /dev/null para probar si un archivo existe sin producir ninguna salida:

    if cp Documents/test.c /dev/null 2> /dev/null; then
      echo "File exists and is readable"
    else
      echo "File does not exist or is not readable"
    fi

    Este script intenta copiar test.c a /dev/null. Si tiene éxito, significa que el archivo existe y se puede leer.

  5. Borrar el contenido de un archivo:
    Puedes usar /dev/null para borrar rápidamente el contenido de un archivo:

    cat /dev/null > combined_output.log

    Comprueba que el archivo ahora está vacío:

    cat combined_output.log

    No deberías ver ninguna salida, lo que indica que el archivo ahora está vacío.

Resumen

En este laboratorio, has aprendido sobre la redirección de flujos de datos en Linux. Has practicado:

  1. Redirección básica de salida utilizando > y >>.
  2. Comprensión de la entrada, salida y error estándar.
  3. Redirección del error estándar utilizando 2>.
  4. Descarte de salida mediante la redirección a /dev/null.

Estas técnicas de redirección son herramientas poderosas en Linux que te permiten controlar a dónde va la salida de tus comandos. Son esenciales para la escritura de scripts, el registro y la gestión efectiva de la salida de comandos. A medida que sigas trabajando con Linux, encontrarás muchas situaciones en las que estas técnicas resulten útiles.