Introducción
En Linux, la redirección es una característica poderosa que te permite controlar hacia dónde se dirigen 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 introducirá al 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 fundamentos de la redirección de salida:
Abre tu terminal. Deberías estar en el directorio
/home/labex/project. Si no estás seguro, puedes escribirpwd(print working directory) para verificar tu ubicación actual.Crearemos un nuevo archivo llamado
redirectcon algo de contenido. Escribe el siguiente comando:echo 'hello labex' > redirectEste comando realiza dos acciones:
echo 'hello labex'imprime el texto "hello labex"- El símbolo
>redirige esta salida a un archivo llamadoredirect
Si el archivo no existe, se creará. Si ya existe, su contenido será sobrescrito.
Ahora, añadamos más contenido al mismo archivo:
echo 'labex.io' >> redirectEl operador
>>es similar a>, pero en lugar de sobrescribir el archivo, añade el nuevo contenido al final del archivo existente.Para ver el contenido del archivo que acabamos de crear y modificar, utiliza el comando
cat:cat redirectDeberías ver ambas líneas que añadimos al archivo: "hello labex" en la primera línea y "labex.io" en la segunda.
Entendiendo la entrada, salida y error estándar
Antes de profundizar en la redirección, comprendamos tres conceptos importantes:
- Entrada estándar (stdin): Es la fuente de entrada predeterminada, generalmente tu teclado. Es de donde el sistema espera que provenga la entrada.
- Salida estándar (stdout): Es el destino de salida predeterminado, generalmente tu pantalla. Es a donde el sistema envía la salida normal.
- Error estándar (stderr): Es a 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 están representados por 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 usarlos:
Primero, creemos un nuevo directorio llamado
Documents:mkdir DocumentsEste comando crea un nuevo directorio. Si recibes un error indicando que el directorio ya existe, no te preocupes; significa que puedes usar el existente.
Ahora, creemos un archivo C en este directorio:
cat > Documents/test.c << EOF #include <stdio.h> int main() { printf("hello world\n"); return 0; } EOFEste comando realiza varias acciones:
cat >inicia el proceso de escritura en un archivoDocuments/test.ces el archivo en el que estamos escribiendo<< EOFle dice al shell que siga aceptando entrada hasta que vea "EOF" (End Of File)- Las líneas intermedias son el contenido que estamos escribiendo en el archivo
- El
EOFfinal marca el fin de la entrada
Ahora, veamos el contenido de este archivo:
cat Documents/test.cDeberías ver el código C que acabamos de crear.
Redirección del error estándar
Ahora, exploremos cómo redirigir el error estándar:
Intenta leer dos archivos, uno que existe y otro que no:
cat Documents/test.c nonexistent.cVerás el contenido de
test.c(que existe) y un mensaje de error paranonexistent.c(que no existe). El contenido detest.cse envía a stdout, mientras que el mensaje de error se envía a stderr.Ahora, redirijamos 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.logEste comando realiza varias acciones:
cat Documents/test.c nonexistent.cintenta mostrar el contenido de ambos archivos> output.logredirige stdout (descriptor de archivo 1) a un archivo llamadooutput.log2> error.logredirige stderr (descriptor de archivo 2) a un archivo llamadoerror.log
Visualiza el contenido de ambos archivos:
echo "Output log:" cat output.log echo "Error log:" cat error.logDeberías ver el contenido de
test.cenoutput.logy el mensaje de error sobrenonexistent.cenerror.log.
Combinación de salida estándar y 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 particularmente útil cuando quieres capturar toda la salida de un comando, ya sea salida normal o mensajes de error.
Intentemos listar el contenido de nuestro directorio actual y de un directorio inexistente en un solo comando:
ls -l . nonexistent_directory > combined_output.log 2>&1Este comando realiza varias acciones:
ls -l .lista el contenido del directorio actualnonexistent_directoryes un intento de listar un directorio que no existe> combined_output.logredirige stdout a un archivo llamadocombined_output.log2>&1redirige stderr al mismo lugar que stdout (que escombined_output.logen este caso)
Ahora, verifiquemos el contenido de nuestro archivo de salida combinada:
cat combined_output.logDeberías ver tanto el listado del directorio como el mensaje de error sobre el directorio inexistente en este archivo.
Existe una forma abreviada de redirigir tanto stdout como stderr al mismo archivo en bash:
ls -l . nonexistent_directory &> another_combined_output.logEl operador
&>es equivalente a> file 2>&1.Verifica el contenido de este nuevo archivo:
cat another_combined_output.logDeberías ver la misma salida que en el archivo anterior.
Usos avanzados de /dev/null
El dispositivo /dev/null, a menudo llamado "bit bucket" o "agujero negro", es un archivo especial que descarta todos los datos escritos en él. Tiene varias aplicaciones útiles en el scripting de shell y operaciones de línea de comandos.
Suprimir la salida de comandos: Ya hemos visto cómo suprimir la salida estándar:
ls -l > /dev/nullY cómo suprimir tanto la salida estándar como el error estándar:
ls -l nonexistent_directory > /dev/null 2>&1Suprimir solo los mensajes de error: A veces quieres ver la salida pero no los mensajes de error:
ls -l . nonexistent_directory 2> /dev/nullDeberías ver el listado del directorio, pero no el error sobre el directorio inexistente.
Usar /dev/null como un archivo vacío:
/dev/nullpuede usarse como una entrada de archivo vacía. Esto es útil para comandos que requieren un archivo de entrada pero no deseas proporcionar ninguna entrada real. Por ejemplo:grep "pattern" /dev/nullEste comando no producirá ninguna salida porque
/dev/nulles un archivo vacío.Probar la existencia de un archivo: Puedes usar
/dev/nullpara 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" fiEste script intenta copiar
test.ca/dev/null. Si tiene éxito, significa que el archivo existe y es legible.Limpiar el contenido de un archivo: Puedes usar
/dev/nullpara limpiar rápidamente el contenido de un archivo:cat /dev/null > combined_output.logVerifica que el archivo esté ahora vacío:
cat combined_output.logNo deberías ver ninguna salida, lo que indica que el archivo está ahora vacío.
Resumen
En este laboratorio, has aprendido sobre la redirección de flujos de datos en Linux. Has practicado:
- Redirección básica de salida usando
>y>>. - Entender la entrada, salida y error estándar.
- Redirigir el error estándar usando
2>. - Descartar la salida redirigiéndola a
/dev/null.
Estas técnicas de redirección son herramientas poderosas en Linux que te permiten controlar hacia dónde va la salida de tus comandos. Son esenciales para el scripting, el registro de eventos (logging) y la gestión efectiva de la salida de comandos. A medida que continúes trabajando con Linux, encontrarás muchas situaciones donde estas técnicas resultarán útiles.



