-
Notifications
You must be signed in to change notification settings - Fork 0
02 Redireccion de Output
- File Descriptors
- Redirección del stdout
- Redirección del stderr
- Redirección de stdout y stderr
- Descarte de stdout y stderr
- Referencias
Los file descriptors son números enteros que el sistema operativo utiliza para identificar los archivos abiertos de un proceso. Los tres file descriptors estándar son:
- 0: stdin
- 1: stdout
- 2: stderr
Estos números son los que utilizamos en los operadores de redirección (e.g.,
2> para redirigir stderr, 1> o simplemente > para stdout).
Por defecto, el stdout es mostrado en la terminal, pero podemos redirigirlo a
un archivo utilizando el operador > (write: sobreescribe el contenido de un
archivo), o el operador >> (append: añade texto en un archivo) de la
siguiente manera:
admin@server:~$ comando > archivo
admin@server:~$ comando >> archivoPor ejemplo:
admin@server:~$ ls /var/log > ls_stdout_.txt
admin@server:~$ ls /var/log >> ls_stdout_.txtSi el comando anterior produjo stdout, entonces este se habrá almacenado en el archivo especificado. Si el comando anterior produjo stderr, este se mostrará en la terminal.
Por defecto, el stderr es mostrado en la terminal, pero podemos redirigirlo a
un archivo utilizando el operador 2> (write: sobreescribe el contenido de un
archivo), o el operador 2>> (append: añade texto en un archivo) de la
siguiente manera:
admin@server:~$ comando 2> archivo
admin@server:~$ comando 2>> archivoPor ejemplo:
admin@server:~$ ls /root 2> ls_stderr.txt
admin@server:~$ ls /root 2>> ls_stderr.txtSi el comando anterior produjo stderr, entonces este se habrá almacenado en el archivo especificado. Si el comando anterior produjo stdout, este se mostrará en la terminal.
Existen ocasiones donde queremos redirigir el stdout y stderr a archivos
separados. Esto lo podemos lograr utilizando los operadores > y 2>, por
ejemplo:
admin@server:~$ ls /usr/bin /bin /root > ls_stdout_.txt 2> ls_stderr.txtEn caso de que queramos redirigir el stdout y stderr al mismo archivo, podemos hacerlo de las siguientes maneras:
admin@server:~$ comando > archivo 2>&1
admin@server:~$ comando 2> archivo 1>&2
admin@server:~$ comando &> archivoImportant
El orden importa: > archivo 2>&1 NO es lo mismo que 2>&1 > archivo:
- En el primer caso, primero se redirige stdout al archivo, luego stderr sigue a stdout (al archivo).
- En el segundo caso, stderr se redirige a donde actualmente apunta stdout (la terminal), luego stdout se redirige al archivo.
Por ejemplo:
admin@server:~$ ls /usr/bin /root > output.txt 2>&1
admin@server:~$ ls /usr/bin /root 2> output.txt 1>&2
admin@server:~$ ls /usr/bin /root &> output.txtNote
En estos ejemplos se utilizaron solo operadores de redirección write (>,
2>, &>). También podemos utilizar sus equivalentes append, para evitar
sobreescritura (>>, 2>>, &>>).
Los comandos anteriores funcionan de manera similar. Cabe destacar que:
-
En el primer comando, el
2>&1significa: manda el stderr al mismo lugar que el stream 1 (stdout), en este caso al archivo especificado. -
En el segundo comando, el
1>&2significa: manda el stdout al mismo lugar que el stream 2 (stderr), en este caso al archivo especificado. -
En el tercer comando, el
&>significa: redirige el stdout y el stderr a un mismo archivo.
Tip
el operador &> ha sido introducido en versiones recientes de bash, por lo
que recomiendo utilizarlo solo en la terminal. Para bash scripting
recomiendo utilizar cualquiera de los métodos anteriores para garantizar una
mayor compatibilidad.
Hay algunos casos en los que no queremos el stdout o stderr de un comando,
para ello podemos redirigirlo al archivo especial /dev/null de la siguiente
manera:
admin@server:~$ comando > /dev/null
admin@server:~$ comando 2> /dev/null
admin@server:~$ comando > /dev/null 2>&1
admin@server:~$ comando &> /dev/nullPor ejemplo:
admin@server:~$ cat archivo > /dev/null
admin@server:~$ cat archivo 2> /dev/null
admin@server:~$ cat archivo > /dev/null 2>&1
admin@server:~$ cat archivo &> /dev/nullTip
Prueba estos cuatro comandos con archivos existentes e inexistentes y observa su comportamiento.
Note
El archivo /dev/null es un archivo especial que, al escribir texto en él, es
descartado (no se almacena). Ejecute man 4 null para más información.
- Shotts, W. (2019). Redirection. The Linux Command Line (2nd ed., pp. 49-60). No Starch Press.
- Definición y Estructura de un Shell
- Los Diferentes Tipos de Shell
- Definición y Sintaxis de un Comando
- Variables, Alias y Funciones
- Comandos de Utilidad y Consulta
- Linux como Sistema Multiusuario
- Introducción a los Usuarios y Grupos
- Gestión de Usuarios
- Gestión de Grupos
- Gestión de Contraseñas
- Búsqueda de Información de Usuarios y Grupos con
getent
- Atributos de Archivos: Propiedad y Permisos de los Archivos
- Cambio de Propiedad y Permisos
umask: Permisos Predeterminados de Archivos- Cambio de Identidad y Privilegios
- Gestión de Paquetes (Package Management)
- Compresión y Archivado de Archivos
- Optimización y Conversion de Archivos