Todo proceso comienza con tres canales abiertos llamados descriptores de archivo (file descriptors). La entrada estándar (stdin, descriptor 0) es de donde lee la entrada, normalmente el teclado. La salida estándar (stdout, descriptor 1) es a donde van los resultados normales, y el error estándar (stderr, descriptor 2) es a donde van los mensajes de error; ambos aparecen normalmente en tu terminal. La redirección te permite conectar estos canales a archivos o a otros comandos, y así es como capturas resultados para una tarea del examen que dice 'guarda la salida en un archivo'.
Los operadores de salida son fáciles de confundir, así que apréndelos con precisión. > envía stdout a un archivo, creándolo o sobrescribiéndolo. >> añade stdout al final de un archivo, conservando lo que ya había. 2> envía stderr a un archivo, y 2>> añade stderr. < hace que un archivo sea la stdin del comando. Redirigir a /dev/null, un archivo especial que descarta todo lo que se escribe en él, es la forma estándar de desechar la salida no deseada.
find /etc -name '*.conf' > found.txt 2> errors.txt # separar resultados y errores
find /etc -name '*.conf' > all.txt 2>&1 # ambos en un solo archivo
find /etc -name '*.conf' 2> /dev/null # ocultar errores de permisos
sort < names.txt # archivo como stdin
2>&1 significa 'envía el descriptor 2 a donde apunte en este momento el descriptor 1'. El shell procesa las redirecciones de izquierda a derecha, así que el orden importa. cmd > file 2>&1 primero apunta stdout al archivo y luego apunta stderr al mismo lugar, así que ambos terminan en el archivo. cmd 2>&1 > file apunta stderr a la terminal (donde estaba stdout en ese momento) y solo después mueve stdout, así que los errores siguen apareciendo en pantalla. Bash también acepta &> file como atajo para enviar ambos a un archivo.
Una tubería (pipe), |, conecta la stdout de un comando con la stdin del siguiente, lo que te permite construir una pequeña cadena de procesamiento: ps aux | grep sshd | wc -l. Solo stdout viaja por una tubería; stderr sigue yendo a la terminal a menos que agregues 2>&1 antes de la tubería. Las tuberías son la razón por la que herramientas pequeñas como grep, sort, uniq, head y wc son tan útiles juntas.
tee es la herramienta para cuando quieres ver la salida y guardarla al mismo tiempo. Copia su stdin a stdout y a uno o más archivos: df -h | tee disk.txt. Usa tee -a para añadir en lugar de sobrescribir. tee es también la forma habitual de escribir un archivo que pertenece a root desde una cuenta normal, porque en sudo echo text > /etc/file la redirección la hace tu propio shell sin privilegios y falla, mientras que echo text | sudo tee /etc/file ejecuta como root el proceso que escribe.
Términos clave
- stdin, stdout, stderr
- Los descriptores de archivo 0, 1 y 2: la entrada estándar, la salida normal y la salida de errores de todo proceso.
- > y >>
- Redirigen stdout a un archivo, sobrescribiéndolo (>) o añadiendo al final (>>).
- 2>&1
- Redirige stderr a donde apunte stdout en ese momento; colócalo después de la redirección de stdout.
- Pipe (tubería, |)
- Conecta la stdout de un comando con la stdin del siguiente.
- tee
- Copia su entrada tanto a la pantalla (stdout) como a archivos; -a añade al final.
Una tarea dice: busca en todo el sistema de archivos los archivos que pertenecen al usuario harry y guarda la lista en /root/harry-files, descartando los errores. Ejecutas find / -user harry > /root/harry-files 2> /dev/null y luego cat /root/harry-files para confirmar que el archivo contiene solo rutas y ninguna línea de 'Permission denied'.
> file 2>&1 captura ambos flujos en el archivo, pero 2>&1 > file deja los errores en la terminal. Recuerda también que un solo > sobrescribe; usa >> cuando la tarea diga añadir (append).Comprueba lo que sabes
¿Cuál es la diferencia entre > y >>?
> trunca (sobrescribe) el archivo de destino, mientras que >> añade al final.
¿Por qué falla sudo echo hi > /etc/motd para un usuario normal?
Tu propio shell sin privilegios realiza la redirección antes de que se ejecute sudo; usa en su lugar echo hi | sudo tee /etc/motd.
¿Una tubería lleva los mensajes de error al siguiente comando?
No, solo stdout. Agrega 2>&1 antes de la tubería si quieres que stderr también pase por ella.