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 su teclado y stdout
es su pantalla o ventana de terminal.
Entonces, cuando corres 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 lo stdin
hacen, siendo su editor de texto uno de esos. Se lee stdin
para aceptar las pulsaciones del teclado, hacer cosas y luego escribe cosas stdout
.
Sin embargo, también hay comandos no interactivos o de "filtro" que NO funcionan de manera interactiva, pero quieren un montón de datos. Estos comandos tomarán todo lo que stdin
tenga, le harán algo y luego lo lanzarán astdout
Veamos otro comando llamado du
: representa el uso del disco. du /usr
, por ejemplo, imprimirá (para stdout
gustarle cualquier otro comando de Linux) una lista de cada archivo 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 se puede ver de inmediato, no está ordenado, y probablemente desee ordenarlo por orden de tamaño.
sort
es uno de esos comandos de "filtro" que tomará un montón de cosas stdin
y las ordenará.
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
comando de uno al stdin
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 múltiples comandos de tipo filtro.
Si escribe sort
solo, aún intentará leer stdin
. Como stdin
está conectado a su teclado, esperará a que escriba y procese las cosas hasta que presione Control-D. No le avisará, ya que no está destinado a ser utilizado de forma interactiva.
Es posible que un programa sepa si stdin
es interactivo o no, por lo que algunos programas pueden actuar de manera diferente si los emite por sí mismos o al final de una tubería.
Además, canalizar un programa que solo funciona de forma interactiva, por ejemplo vi
, te hará pasar un mal momento.
Las canalizaciones son diferentes de la redirección en que los datos se barajan de un comando a otro sin almacenarse en ningún lado. Entonces, en el ejemplo anterior, du
la salida de 'no se almacena en ningún lado. La mayoría de las veces no quiere 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 le permite tener su pastel y comérselo también, lo hará copie lo que recibe de stdin
ambos stdout
y un archivo de su elección. También es probable que pueda hacer esto bash
con alguna sintaxis arcana que implique símbolos y corchetes que no conozco.
|
es que no utiliza un nombre, la salida del comando l-hand se pasa directamente a la entrada para el comando en el lado de la mano derecha de la tubería.