Si se siente cómodo con la redirección de entrada y salida, la explicación es bastante sencilla.
Command1 | Command2
hace lo mismo que
Command1 > tempfile
Command2 < tempfile
pero sin tempfile
. La salida de Command1
está conectado directamente a la entrada de Command2
y la transferencia ocurre en la memoria.
Lo siguiente se simplifica un poco para ayudar a los nuevos usuarios.
Bueno, primero, es necesario comprender el concepto de entrada estándar y salida estándar.
En Linux y otros sistemas operativos similares a UNIX, cada proceso tiene una entrada estándar (stdin
) y una salida estándar (stdout
). La situación habitual es que stdin
es tu teclado y stdout
es tu pantalla o ventana de terminal.
Así que cuando ejecutas ls
, arrojará su salida a stdout
. Si no hace nada más, irá a su pantalla o ventana de terminal y lo verá.
Ahora, algunos comandos de Linux interactúan con el usuario y usan stdin
para hacer eso, su editor de texto es uno de esos. Se lee desde stdin
para aceptar tus pulsaciones de teclas, hacer cosas y luego escribir cosas en stdout
.
Sin embargo, también hay comandos no interactivos o de "filtro" que NO funcionan de forma interactiva, pero necesitan un montón de datos. Estos comandos tomarán todo stdin
tiene, hágale algo y luego tírelo a stdout
Veamos otro comando llamado du
- representa el uso del disco. du /usr
, por ejemplo, se imprimirá (a stdout
como cualquier otro comando de Linux) una lista de todos los archivos en ese directorio y su tamaño:
# du /usr
2312 /usr/games
124 /usr/lib/tc
692 /usr/lib/rygel-1.0
400 /usr/lib/apt/methods
40 /usr/lib/apt/solvers
444 /usr/lib/apt
6772 /usr/lib/gnash
Como puede ver desde el principio, no está ordenado, y probablemente quiera ordenarlo por tamaño.
sort
es uno de esos comandos de "filtro" que tomará un montón de cosas de stdin
y ordénalo.
Entonces, si hacemos esto:
# du /usr | sort -nr
obtenemos esto, que es un poco mejor:
4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668 /usr/lib/vmware
501700 /usr/share/locale
366476 /usr/lib/x86_64-linux-gnu
318660 /usr/lib/libreoffice
295388 /usr/lib/vmware/modules
290376 /usr/lib/vmware/modules/binary
279056 /usr/lib/libreoffice/program
216980 /usr/share/icons
Y ahora puede ver que la "tubería" conecta el stdout
de un comando al stdin
de otro. Por lo general, lo usará en situaciones como esta en las que desea filtrar, ordenar o manipular la salida de un comando. Se pueden conectar en cascada si desea procesar la salida a través de varios comandos de tipo filtro.
Si escribe sort
por sí mismo, aún intentará leer desde stdin
. Desde stdin
está conectado a su teclado, estará esperando que escriba y procese las cosas hasta que presione Control-D. No le preguntará, ya que en realidad no está destinado a ser utilizado de forma interactiva.
Es posible que un programa diga si stdin
es interactivo o no, por lo que algunos programas pueden actuar de manera diferente si los ejecuta solos o al final de una canalización.
Además, canalizar un programa que solo funciona de forma interactiva, como vi
, hará que lo pases mal.
Las canalizaciones se diferencian de la redirección en que los datos se mezclan de un comando al siguiente sin almacenarse en ningún lugar. Entonces, en el ejemplo anterior, du
La salida de no se almacena en ninguna parte. La mayoría de las veces no desea esto con tuberías porque la razón para usar tuberías es procesar la salida de un comando de alguna manera, pero hay un comando tee
que te permite tener tu pastel y comértelo también, copiará lo que recibe de stdin
a ambos stdout
y un archivo de su elección. Es probable que también puedas hacer esto desde bash
con alguna sintaxis arcana que involucra signos y corchetes que no conozco.
Realmente, si quiere saber qué hacen las canalizaciones y la diferencia entre> y |, vaya a un directorio con muchos archivos y
desde una terminal ls
contra ls | more
(o hacerlo desde Windows con DIR y DIR | MÁS)
Si usó> más, verá que crea un archivo llamado 'más' en lugar de enviar la salida de ls al comando 'más'. Entonces, si alguien hiciera>más, probablemente sería un error, uno no haría>más, harías>archivo1. Más es un comando bien conocido.
El
$ grep a
$ gato archivo1 | grep aabc
grep con 2 parámetros tiene la forma de archivo de patrón grep. grep con un parámetro es patrón grep. Y puede enviarle el archivo canalizando el contenido del archivo o usando <. Si usa <, primero escribe el nombre del comando, luego el nombre del archivo después del comando
Además, muchos comandos toman un archivo como entrada de todos modos, por lo que grep a file1 funcionará, al igual que cat file1 | grep a, y grep a
Estaba haciendo tuberías (|) y> en DOS incluso hace 15 años.
Para resumir cómo | difiere de