Aquí hay un comando que ordena los archivos en una carpeta en orden inverso
ls | sort -r
¿Qué hace el |
símbolo en ese comando?
Lo que realmente estoy buscando aquí es una explicación de alto nivel (fácil de entender) de tuberías para principiantes de Linux. Veo otras preguntas sobre tuberías aquí en Superusuario, pero nada que genere una respuesta que explique en términos simples lo que hacen y en qué se diferencian de la redirección (el símbolo >
o <
).
linux
command-line
bash
pipe
ccalvert
fuente
fuente
|
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.ls -1r
(Tenga en cuenta el argumento número uno) debería producir un resultado similar als | sort -r
.cat /somefile | grep cool
. Esto tomará la salida de algún archivo y lo pondrá a disposición para grep, y luego grep imprimirá todas las líneas con la palabra cool.Respuestas:
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 questdin
es su teclado ystdout
es su pantalla o ventana de terminal.Entonces, cuando corres
ls
, arrojará su salida astdout
. 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 leestdin
para aceptar las pulsaciones del teclado, hacer cosas y luego escribe cosasstdout
.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á (parastdout
gustarle cualquier otro comando de Linux) una lista de cada archivo en ese directorio y su tamaño: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 cosasstdin
y las ordenará.Entonces, si hacemos esto:
# du /usr | sort -nr
obtenemos esto, que es un poco mejor:
Y ahora puede ver que la "tubería" conecta el
stdout
comando de uno alstdin
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á leerstdin
. Comostdin
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 comandotee
que le permite tener su pastel y comérselo también, lo hará copie lo que recibe destdin
ambosstdout
y un archivo de su elección. También es probable que pueda hacer estobash
con alguna sintaxis arcana que implique símbolos y corchetes que no conozco.fuente
stdin
ystdout
es diferente en Windows que en Linux, aunque probablemente no desde el punto de vista de Windowscmd.exe
o Powershell.GetStdHandle()
. También es trivial redirigir las secuencias estándar de un proceso [secundario] generado con .NET, que creo que se asigna a las funciones de Win32 (pero no estoy 100% seguro de eso, no soy un desarrollador de Win32).STARTUPINFO
estructura paraCreateProcess()
.Si se siente cómodo con la redirección de salida y entrada, la explicación es realmente bastante fácil.
hace lo mismo que
pero sin
tempfile
. La salida deCommand1
está directamente conectada a la entrada deCommand2
y la transferencia ocurre en la memoria.fuente
CreateFile
oWriteFile
llama para respaldar su reclamo. / edit: Eso es para la parte de Windows, por supuesto.Realmente, si quieres saber qué hacen las canalizaciones y la diferencia entre> y |, ve a un directorio con muchos archivos y
desde una terminal
ls
vsls | more
(o haciendo eso 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 que haría> file1. Más es un comando bien conocido.
El <like the> también sirve para vincular un comando y un archivo, en lugar de un comando a un comando. Pero mientras> envía la salida de un comando a un archivo, el <envía un archivo como entrada a un comando. Raramente uso <como suelo usar cat file1 | para enviar la salida de un archivo a un comando.
$ grep a <archivo1 abc
$ cat archivo1 | grep a abc
grep con 2 parámetros tiene el formato de archivo de patrón grep. grep con un parámetro es el 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 <archivo. Si usa | para canalizar el contenido de un archivo, usa cat file1 | mando.
Además, muchos comandos toman un archivo como entrada de todos modos, por lo que grep un archivo1 funcionará, al igual que cat file1 | grep a, y grep a <archivo1.
Estaba haciendo canalizaciones (|) y> en DOS incluso hace 15 años.
Para resumir cómo | difiere de <y> - La tubería se encuentra entre 2 comandos El <y> se sienta entre un comando y un archivo. El> se emite a un archivo. El <se ingresa desde un archivo.
fuente
El carácter de canalización (
|
) conecta la salida de un programa a la entrada de otro.En este ejemplo
echo
imprime la palabrahello
ywc -c
hace un recuento de caracteres de su entrada:fuente
Para entender esto, pruébalo tú mismo:
Ahora estás colgando con un cursor, y no está haciendo nada. ¿Qué sucede si escribes algunos datos?
Todavía nada, ¿verdad? Ahora presiona ctrl + D
Entonces, lo que hace es tomar entrada (lo que escribió), hace algo con ella (ordena) y la devuelve como salida. El
ls
comando no toma entrada, solo genera salida. El símbolo de tubería toma la salidals
y la alimenta como entrada alsort
comando.>
no alimenta la salida a un programa, pero almacena la salida como un archivo.<
usa un archivo como entrada.fuente