105

Flujos estándar y cómo los Pipes nos pueden dar super poderes

Antes de enseñarte los poderes que nos podrían proporcionar los Pipes, me gustaría mencionarte y recordate que en Linux/Unix cada nuevo proceso generado, es decir, cada nueva aplicación ejecutada, es inicializada con tres canales de datos, canales conocidos cómo streams. Ver clase.

  • Standar Input

  • Standar Output

  • Standar Error

streams.png
  • El Standard input, es la entrada de datos de nuestro programa

  • En el Standard output el programa colocará todos los mensajes que necesita que el usuario visualice. Estos mensajes no deben de considerarse advertencias o errores.

  • En el Standard error el programa colocará todos los mensajes de advertencias y errores que puedan sucitarse durante la ejecución del mismo.

TRABAJEMOS CON LOS INPUTS Y OUTPUTS

Ahora, veamos un ejemplo de cómo podemos sacarle provecho a los stream. El comando history nos permite conocer los últimos comandos ejecutados en nuestra sesión, ya para este punto del curso, seguro has ejecutado varios comandos en la terminal. Basta con que ejecutes history en tu terminal (Te prometo que no pasará nada malo ;D ).

juan@DESKTOP:~$ history

Una vez ejecutado estaremos visualizando en pantalla un listado de todos los comandos que hemos utilizado. Todo el texto que visualizamos (los comandos) se encuentran en el stream de el Standard output.

Si nosotros así lo deseamos, podemos almacenar esa salida en un archivo de texto plano. Basta con utilizar el signo mayor > que, seguido del nombre del archivo

juan@DESKTOP:~$ history > ultimos_comandos.txt

Con el signo mayor que, crearemos el archivo si este no existe, y colocaremos el output del programa allí; En caso que el archivo exista, y esté almacene algún tipo de contenido, el contenido será reemplazado por el output del programa. Si nosotros no queremos perder la contenido que posee un archivo, lo que podemos hacer es utilizar el doble signo mayor que.

[email protected]:~$ history >> ultimos_comandos.txt

Esto hará que el output sea agregado al final del archivo, sin reemplazar nada.

Una vez tenemos el output almacenado, hagamos algo interesante, utilicemos el comando grep para conocer qué archivos o folders has eliminado recientemente.

juan@DESKTOP:~$ grep < ultimos_comandos.txt "rm"

Al ejecutar esta sentencia estaremos visualizando los últimos comandos que cuentan con rm en su ejecución.

Con el signo menor que, estamos colocando todo el contenido del archivo cómo Standar Input del comando grep. A partir de estos inputs, el programa grep ya puede buscar rm

PIPES - Un gran poder conlleva una gran responsabilidad 💪

Existen comandos para muchas cosas, sin embargo, no existe un comando en la actualidad que lo haga todo. Si queremos hacer tareas complejas, es probable que tengamos que apoyarnos de más de un comando.

Regresemos al ejemplo anterior, donde nosotros necesitábamos conocer los archivos o folders eliminados recientemente. Para solucionar la problemática tuvimos que ejecutar el comando history y su output almacenarlo en un archivo, el cual nos sirvió cómo input del programa grep. ¿Obtuvimos el resultado deseado?, Si, pero, somos programadores par favar, siempre podemos mejorarlo. Es Aquí donde entran los TODOPODEROSOS PIPES a salvar el día, y hacer nuestro trabajo cómo administrador de servidores más sencillo.

Ejecutemos la siguiente sentencia.

juan@DESKTOP:~$ history | grep "rm"

¿Qué ha pasao’ amiwito, obtuviste el mismo resultado que en el ejemplo anterior?, Super interesante, ¿no lo crees? obtuvimos el mismo resultado solo que ahora con una sentencia mucho más corta, legible y sin tener que crear nuevos archivos en nuestro disco duro, bastante cool. 😎

El PIPE nos permitirá encadenar la ejecución de programas, pasando el output de uno cómo el input de otro. En este caso estamos colocando el output de history cómo el input de grep. El orden en el que se ejecutarán los programas es de izquierda a derecha y de esa misma manera es cómo se estarán pasados los outputs.

Y así cómo encadenamos la ejecución de dos comandos podemos hacerlo con tres, cinco, o con la n cantidad que necesitemos. Nosotros no estamos limitados únicamente a encadenar programas Unix/Linux, también podemos encadenar nuestros propios programas, no importa si están escritos en Java, Python, PHP etc… claro, siempre y cuando hayamos tomado en cuentos los streams en su codificación.

Termina el curso de Terminal y Línea de Comandos y nunca pares de aprender 🚀

Escribe tu comentario
+ 2
Ordenar por:
3
31846Puntos

Gracias!!

2
4704Puntos

Muchísimas gracias, he entendido bastante, solamente tengo una pregunta, con los pipes entonces ¿hay alguna necesidad de usar los ‘>’, ‘<’, ‘>>’ ?

2
41Puntos

Gracias, fue de muy gran ayuda,

test pipes.PNG
2

No entendi absolutamente nada del comando

grep < ultimos_comandos.txt'rm'

no hallo ninguna diferencia entre ese comando y este

grep 'rm' ultimos_comandos.txt

Alguien podria ayudarme y decirme para que sirve realmente el simbolo menor que en la terminal

<
2

Muchas gracias, me ha dejado los conceptos mucho más claros.

1
6137Puntos

buenisimo todo!

1
16020Puntos
2 años

Muchas gracias 😊

1
17091Puntos

Me encanto y me ayudo mucho gracias

1
9899Puntos

Muchas gracias por este articulo! Fue de gran utilidad para tener mayor claridad en los PIPES y los comandos

1
16020Puntos
2 años

Me da mucha alegría que te haya podido ayudar 😊

1
8895Puntos

¡Muchísimas gracias! Lo dejaste muy claro.

1
16020Puntos
2 años

Me alegra que te haya servido 😊

1
11049Puntos

👏👏 Me encantó la explicación.

1
3707Puntos

Buenísimo el aporte, se entiende super bien

1
1538Puntos

Muchísimas gracias. Antes no lo entendía y ahora me encantan los Pipes. Excelente claridad!

1
2162Puntos

Muchas gracias, esto refuerza a la clase anterior

1
5180Puntos

Buena explicacion!

1
1122Puntos

Muy buena explicación… thanks

1
16020Puntos
2 años

Me alegra que hayas comprendido todo 😉

1
22036Puntos

Gracias 😄

1
2012Puntos

Muy bueno, claramente explicado

1
9451Puntos

Muy buena la explicación

1
9997Puntos

Excelente explicación me ayudo bastante. Gracias

1
7183Puntos

[email protected]:~$ history | grep “rm”

El pipe también te genera el archivo? o como seria con pipe

3
2162Puntos
2 años

No, el Pipe no te generara el archivo.

En el primer ejemplo tu. Buscabas el historial - lo guardabas en un txt - luego con grep"rm" visualizabas los resultados.

con el pipe, te saltas el segundo paso, osea la creación del txt, y solo lo visualizas en pantalla.

Espero te haya podido ayudar.

0
2824Puntos

Una observación:

grep < ultimos_comandos.txt"rm"

Es este caso no es redundante usar el ‘<’ ? Ya que por default grep utiliza un archivo como input?

0
12604Puntos

Muchas gracias! me sirvió un buen

0
8323Puntos

Wow, en serio te lo agradezco de corazón. Explicaste perfectamente con ejemplos, de forma clara y de modo que cualquiera pudiera seguir lo que decías sin necesitar archivos extra ni nada por el estilo. La verdad te felicito, se nota que tienes la voluntad de aprender, y más importante también de enseñar y ayudar. Vas a llegar muy lejos!

0
3422Puntos

Gracias, muy buen material.

0
22317Puntos

WOOOOOOW! Quedé impresionado, en la clase del curso me preguntaba “yo para qué chuchas quiero todo esto?”. Y en efecto, tu tutorial me aclaró todo y me ocurrió el típico “Ahhhh ya entendí”.
En verdad, excelente aporte y muchísimas gracias, acabas de salvarme para muchas situaciones en mi futuro cómo desarrollador.

0
21959Puntos

Excelente resumen, debería ser tomado en cuenta en clase.

0
8665Puntos

Muchas gracias! ahora quedó mucho más claro.

0
41211Puntos

Muchas gracias por la información 👍

0
1411Puntos

Realmente me quedó muchísimo más claro con este post el uso de los PIPES. Gracias!

0
6000Puntos

jajaja lo mejor que he leído divertido y una explicación mas que clara, ídolo

0
4623Puntos

No puedo creer que me funcionó ejercicio head.jpg