Redirecciones

Acá ya no vamos adentrando un poco más a lo que es el uso más complejo de la terminal y las cosas se empiezan a poner más interesantes.

Los operadores de redireccionamiento son lo que nos permite construir comandos muy complejos en una sola linea.

Archivos

En Linux, todo es un archivo. Y ahora vamos a ver por qué esto es una abstracción muy conveniente.

stdin, stdout y stderr

Estos son los archivos estrella de Linux, porque representan a lo que nos permite comunicarnos con el sistema. Veamos qué es cada uno: stdin (representa el teclado), stdout (la pantalla) y stderr (los mensajes de error que muestran en pantalla)

Estan siempre abiertos por defecto y, así como cualquier otro archivo abierto, pueden ser redireccionados.

La redirección significa simplemente capturar la salida de un archivo, comando, programa, script o inclusive un bloque de código dentro de un script y enviarlo como entrada hacia otro archivo, comando, programa o script.

Veamos las alternativas que tenemos

# command_output >
# Redirecciona la salida estándar a un archivo.
# Crea una archivo si no existe, sino lo sobrecribe
# Ejemplo: crea un archivo que contiene un listado del árbol de directorios.
[vkmc@amaterasu ~]$ ls -lR > dir-tree.list
[vkmc@amaterasu ~]$ head dir-tree.list
.:
total 52
drwxrwxr-x. 3 vkmc vkmc 4096 Jul 29 20:29 Ceph
drwxr-xr-x. 2 vkmc vkmc 4096 Jul 3 19:24 Desktop
-rw-rw-r--. 1 vkmc vkmc 0 Oct 12 14:39 dir-tree.list
drwxr-xr-x. 2 vkmc vkmc 4096 Oct 9 17:36 Documents
drwxr-xr-x. 7 vkmc vkmc 4096 Oct 11 12:29 Downloads
drwxr-xr-x. 2 vkmc vkmc 4096 Jul 3 19:24 Music
drwxrwxr-x. 3 vkmc vkmc 4096 Jul 18 11:20 OpenStack
drwxr-xr-x. 3 vkmc vkmc 4096 Oct 9 11:25 Pictures
# : > file
# : es un built-in especial de Bash que representa la operación nula (no-op)
# El operador > trunca el archivo archivo.txt a uno con tamaño 0 byte.
# Si el archivo no existe, crea uno de 0 byte de tamaño
# E
[vkmc@amaterasu ~]$ : > nada
[vkmc@amaterasu ~]$ head nada
[vkmc@amaterasu ~]$
# > file
# El operador > trunca el archivo archivo.txt a uno con tamaño 0 byte.
# Si el archivo no existe, crea uno de 0 byte de tamaño
# Exactamente el mismo comportamiento que el comando touch
# Este comando tiene el mismo resultado que el comando anterior (: > file),
# pero este no funciona en algunas shells
[vkmc@amaterasu ~]$ > nada-2
[vkmc@amaterasu ~]$ head nada-2
[vkmc@amaterasu ~]$
# vemos que efectivamente los archivos creados
# son de 0 bytes (quinta columna)
[vkmc@amaterasu ~]$ ls -alH | grep nada
-rw-rw-r--. 1 vkmc vkmc 0 Oct 12 16:45 nada
-rw-rw-r--. 1 vkmc vkmc 0 Oct 12 16:46 nada-2
# command_output >>
# Redirige el stdout a un archivo
# Crea un archivo si no existe, en otro caso concatena el contenido a este
[vkmc@amaterasu ~]$ echo "Aprendiendo comandos de redirección" >> linuxchix-bash-workshop
[vkmc@amaterasu ~]$ cat linuxchix-bash-workshop
Aprendiendo comandos de redirección
[vkmc@amaterasu ~]$ echo "Ahora aprendemos el comando >>" >> linuxchix-bash-workshop
[vkmc@amaterasu ~]$ cat linuxchix-bash-workshop
Aprendiendo comandos de redirección
Ahora aprendemos el comando >>

IMPORTANTE. ¿Se dieron cuenta que los archivos no tienen extensión? En Linux los archivos no necesitan que se indique, en el nombre del archivo, que tipo de archivo es. Esta información se almacena en la estructura del archivo y es invisible al usuario.

File descriptors

Cada archivo abierto tiene asignado un file descriptor. Un file descriptor es simplemente un número que el sistema operativo asigna a un archivo abierto para poder hacerle un seguimiento. Se lo podría considerar como un identificador de un archivo.

Los descriptores para stdin, stdout y stderr son 0, 1 y 2 respectivamente. Para los restantes archivos abiertos, están disponibles los descriptores del 3 al 9.

Veamos algunos ejemplos combinando redireccionamiento y file descriptors:

# Redirige el stdout a un archivo mi-stdout
1 > mi-stdout
# Redirige y concatena el stdout a un archivo mi-stdout
1 >> mi-stdout
# Redirige el stderr a un archivo mi-stderr
2 > mi-stderr
# Redirige y concatena el stderr a un archivo mi-stderr
2 >> mi-strerr
# Redirige tanto el stdout como el stderr a un archivo mi-stdout-y-stderr
& > mi-stdout-y-stderr