Normalmente cuando administramos un servidor Linux usamos SSH y una terminal para administrarlo, aquí quiero describir los conceptos de redireccionar output e input en la terminal al manejar comandos y ficheros.
Índice de contenidos
Conceptos de Stream Estandar de Linux
En Linux existen tres Stream Estándares:
- stdin número lógico 0
- stdout número lógico 1
- stderr número lógico 2
Cada redirección se comportara diferente dependiendo de cada uno de estos streams.
Redirecciones
Redirección | (pipe)
Cuando usamos una redirección por medio del pipe o el caracter “|” buscamos enviar el output del anterior comando como entrada del segundo comando. En el siguiente ejemplo mostraremos la redirección del resultado de listar los contenidos de nuestro home de root y buscando sobre ese la palabra Music.
[root@localhost ~]# ls -l
total 0
-rw-r--r-- 1 root root 0 sep 21 01:09 archivo.txt
drwxr-xr-x 2 root root 6 sep 21 01:06 Desktop
drwxr-xr-x 2 root root 6 sep 21 01:06 Documents
drwxr-xr-x 2 root root 6 sep 21 01:06 Downloads
drwxr-xr-x 2 root root 6 sep 21 01:07 Music
drwxr-xr-x 2 root root 6 sep 21 01:07 Pictures
drwxr-xr-x 2 root root 6 sep 21 01:07 Public
drwxr-xr-x 2 root root 6 sep 21 01:07 Templates
drwxr-xr-x 2 root root 6 sep 21 01:07 Videos
[root@localhost ~]# ls -l | grep 'Music'
drwxr-xr-x 2 root root 6 sep 21 01:07 Music
Otro ejemplo puede ser cuando buscamos paginar por medio de more la salida del comando ls.
[root@localhost ~]# ls -l | more
total 0
-rw-r--r-- 1 root root 0 sep 21 01:09 archivo.txt
drwxr-xr-x 2 root root 6 sep 21 01:06 Desktop
drwxr-xr-x 2 root root 6 sep 21 01:06 Documents
drwxr-xr-x 2 root root 6 sep 21 01:06 Downloads
drwxr-xr-x 2 root root 6 sep 21 01:07 Music
drwxr-xr-x 2 root root 6 sep 21 01:07 Pictures
drwxr-xr-x 2 root root 6 sep 21 01:07 Public
--Más--
Redirección >
Esta la usamos para enviar la salida del comando anterior al archivo hacia la derecha.
[root@localhost ~]# ls -l > salidalista.txt
[root@localhost ~]# cat salidalista.txt
total 0
-rw-r--r-- 1 root root 0 sep 21 01:09 archivo.txt
drwxr-xr-x 2 root root 6 sep 21 01:06 Desktop
drwxr-xr-x 2 root root 6 sep 21 01:06 Documents
drwxr-xr-x 2 root root 6 sep 21 01:06 Downloads
drwxr-xr-x 2 root root 6 sep 21 01:07 Music
drwxr-xr-x 2 root root 6 sep 21 01:07 Pictures
drwxr-xr-x 2 root root 6 sep 21 01:07 Public
-rw-r--r-- 1 root root 0 sep 21 01:13 salidalista.txt
drwxr-xr-x 2 root root 6 sep 21 01:07 Templates
drwxr-xr-x 2 root root 6 sep 21 01:07 Videos
[root@localhost ~]#
También podemos usar el comando echo y redireccionar su salida a un archivo.
[root@localhost ~]# echo 'Hola, vengo de un echo' > archivo.txt
[root@localhost ~]# cat archivo.txt
Hola, vengo de un echo
[root@localhost ~]#
Hemos visto estos comandos actuar pero hay que recordar que sólo manejan el stream stdout.
Redirección >>
Muy parecido a nuestra anterior redirección pero esta la usamos para adjuntar nuestra salida al contenido actual del archivo, en ingles le llamamos “append”. Por ejemplo a nuestro anterior echo podemos agregarle un nuevo echo.
[root@localhost ~]# echo 'Yo vengo de un segundo echo' >> archivo.txt
[root@localhost ~]# cat archivo.txt
Hola, vengo de un echo
Yo vengo de un segundo echo
[root@localhost ~]#
Así como la redirección > esta también funciona por medio del stdout
Redirección 2>
Hay veces que ejecutamos comandos que nos generan mensajes de error, cuando usamos las anteriores redirecciones, nosotros no podemos ver en el archivo generado esos errores, es por lo que comentamos al principio se está cachando el stream stdout y no el stderr.
Si buscamos enlistar los contenidos de un directorio que no existe con ls la salida que nos mostrara es por stderr y no por stdout, por ejemplo:
[root@localhost ~]# ls -l ./Directorio-no-existente > output.txt 2> error.txt
[root@localhost ~]# cat output.txt
[root@localhost ~]# cat error.txt
ls: no se puede acceder a './Directorio-no-existente': No existe el fichero o el directorio
[root@localhost ~]# ls -l ./Directorio-no-existente 1> output.txt 2> error.txt
[root@localhost ~]# cat output.txt
[root@localhost ~]# cat error.txt
ls: no se puede acceder a './Directorio-no-existente': No existe el fichero o el directorio
[root@localhost ~]#
En el ejemplo anterior mostré el comando ls mandando la salida por nuestro habitual > y después explícitamente escribiendo 1> que hacen lo mismo.
Como podemos ver la salida del error del comando ejecutado ls se fue al archivo error.txt que fue redireccionando su salida por medio de 2>
Redirección 2>&1
Pero en ocasiones necesitamos ver secuencialmente donde sale el error al ejecutar el comando en el mismo redireccionamiento estándar, para esto escribimos en el comando que envié el stderr al mismo stdout de la siguiente forma:
[root@localhost ~]# ls -l ./Directorio-no-existente 1> output.txt 2>&1
[root@localhost ~]# cat output.txt
ls: no se puede acceder a './Directorio-no-existente': No existe el fichero o el directorio
[root@localhost ~]#
Redirección <
Hay muchos comandos que reciben un archivo como parámetro o como una entrada stream, entre ellos tenemos el comando grep, si queremos enviar al comando la salida de un archivo por medio del stream stdin lo podemos hacer de la siguiente forma:
[root@localhost ~]# cat salidalista.txt
total 0
-rw-r--r-- 1 root root 0 sep 21 01:09 archivo.txt
drwxr-xr-x 2 root root 6 sep 21 01:06 Desktop
drwxr-xr-x 2 root root 6 sep 21 01:06 Documents
drwxr-xr-x 2 root root 6 sep 21 01:06 Downloads
drwxr-xr-x 2 root root 6 sep 21 01:07 Music
drwxr-xr-x 2 root root 6 sep 21 01:07 Pictures
drwxr-xr-x 2 root root 6 sep 21 01:07 Public
-rw-r--r-- 1 root root 0 sep 21 01:13 salidalista.txt
drwxr-xr-x 2 root root 6 sep 21 01:07 Templates
drwxr-xr-x 2 root root 6 sep 21 01:07 Videos
[root@localhost ~]# grep 'Music' < salidalista.txt
drwxr-xr-x 2 root root 6 sep 21 01:07 Music
[root@localhost ~]# grep 'Music' salidalista.txt
drwxr-xr-x 2 root root 6 sep 21 01:07 Music
[root@localhost ~]#
Comentarios finales
Como se puede ver hay muchas formas de buscar redireccionar las salidas de nuestros comandos, sólo hay que buscar la forma correcta y tener bien identificado el stream que buscamos manejar.
Como siempre si les gusta compartan y si no también.