22 votos

¿Qué hace el símbolo de pipa de linux "|"?

Este es un comando que ordena los archivos de una carpeta en orden inverso

ls | sort -r

¿Qué hace el | en ese comando?

Lo que realmente busco aquí es una explicación de alto nivel (fácil de entender) de las tuberías para los principiantes de Linux. Veo otras preguntas sobre las tuberías aquí en Superusuario, pero nada que provoque una respuesta que explique en términos simples lo que hacen y cómo se diferencian de la redirección (el > o < símbolo).

29voto

Daniel B Puntos 14509

Si te sientes cómodo con la redirección de la salida y la entrada, la explicación es realmente muy fácil.

Command1 | Command2

hace lo mismo que

Command1 > tempfile
Command2 < tempfile

pero sin tempfile . La salida de Command1 se conecta directamente a la entrada de Command2 y la transferencia se realiza en memoria.

26voto

LawrenceC Puntos 42012

Lo siguiente se simplifica un poco para ayudar a los nuevos usuarios.

Bueno, primero es necesario entender el concepto de entrada y salida estándar.

En Linux y otros sistemas operativos tipo 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.

Así que cuando se ejecuta ls , arrojará su salida a stdout . Si no haces nada más, irá a tu pantalla o ventana de terminal, y lo verás.

Ahora, algunos comandos de Linux interactúan con el usuario, y utilizan stdin para hacerlo, siendo tu editor de texto uno de ellos. Lee desde stdin para aceptar tus pulsaciones, hacer cosas, y luego escribe cosas a stdout .

Sin embargo, también hay comandos no interactivos o "de filtro" que NO funcionan de forma interactiva, sino que quieren un montón de datos. Estos comandos tomarán todo stdin tiene, hacer algo con él, y luego lanzarlo a stdout

Veamos otro comando llamado du - representa el uso del disco. du /usr , por ejemplo, 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 puedes ver de entrada, no está ordenado, y probablemente quieras ordenarlo por tamaño.

sort es uno de esos comandos "filtro" que tomará un montón de cosas de stdin y ordenarlo.

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 puedes ver que la "tubería" conecta el stdout de un mando a la stdin de otro. Normalmente se utiliza en situaciones como ésta, en las que se desea filtrar, ordenar o manipular de algún modo la salida de un comando. Se pueden poner en cascada si se quiere procesar la salida a través de múltiples comandos de tipo filtro.

Si escribe sort por sí mismo, seguirá intentando leer de stdin . Desde stdin está conectado a tu teclado, estará esperando a que escribas, y procesará cosas hasta que pulses Control-D. No te preguntará, ya que no está pensado para 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 forma diferente si los emite solos o al final de una tubería.

Además, la canalización de un programa que sólo funciona de forma interactiva, como vi hará que lo pases mal.

Las tuberías se diferencian de la redirección en que los datos se barajan de un comando a otro sin ser almacenados en ningún lugar. Así, en el ejemplo anterior, du no se almacena en ningún sitio. La mayoría de las veces no se quiere esto con las tuberías porque la razón para usarlas es procesar la salida de un comando de alguna manera - pero, hay un comando tee que te permite tener tu pastel y comerlo también, copiará lo que recibe de stdin a ambos stdout y un archivo de su elección. También es probable que pueda hacerlo desde bash con alguna sintaxis arcana que involucra ampersands y paréntesis que desconozco.

3voto

datasmid Puntos 641

El carácter pipa ( | ) conecta la salida de un programa con la entrada de otro.

En este ejemplo echo imprime la palabra hello y wc -c hace un recuento de caracteres de su entrada:

echo hello | wc -c

Estudia más Unix para saber por qué imprime 6.

3voto

jondro Puntos 125

Realmente si quieres saber lo que hacen las tuberías y la diferencia entre > y |, entonces ve a un directorio con muchos archivos, y

desde una terminal ls vs ls | more (o hacerlo desde Windows con DIR y DIR | MORE)

Si has utilizado > more verás que crea un archivo llamado 'more' en lugar de enviar la salida de ls al comando 'more'. Así que si alguien hiciera >more probablemente sería un error, no se haría >more se haría >file1. More es un comando bien conocido.

El < al igual que el > es también para enlazar un comando y un archivo, en lugar de un comando a otro. Pero mientras el > envía la salida de un comando a un archivo, el < envía un archivo como entrada a un comando. Rara vez uso < ya que suelo usar cat archivo1 | para enviar la salida de un archivo a un comando.

$ grep a < archivo1 abc

$ cat archivo1 | grep a abc

grep con 2 parámetros es de la forma grep pattern file. grep con un parámetro es grep pattern. Y puedes enviarle el archivo canalizando el contenido del archivo, o usando <. Si usas <, escribes el nombre del comando primero, y luego el nombre del archivo después del comando < archivo. Si se utiliza | para canalizar el contenido de un archivo, se utiliza el comando cat archivo1 |.

Además, muchos comandos toman un archivo como entrada, así que grep a archivo1 funcionará, al igual que cat archivo1 | grep a, y grep a < archivo1.

Yo hacía pipes (|) y > en DOS incluso hace 15 años.

Para resumir la diferencia entre | y < y > - La tubería se sitúa entre 2 comandos El < y el > se sitúan entre un comando y un archivo. El > es la salida a un archivo. El < es la entrada desde un archivo.

2voto

jornane Puntos 636

Para entenderlo, pruébalo tú mismo:

sort -r

Ahora estás colgado con un cursor, y no hace nada. ¿Qué pasa si escribes algunos datos?

1
2
3
5
4

Todavía no hay nada, ¿verdad? Ahora pulsa ctrl+D

5
4
3
2
1

Lo que hace la ordenación es que toma la entrada (lo que has escrito), hace algo con ella (la ordena) y la devuelve como salida. El ls no recibe entradas, sólo genera salidas. El símbolo de la tubería toma la salida de ls y lo alimenta como entrada al sort comando.

> no alimenta la salida a un programa, sino que almacena la salida como un archivo. < utiliza un archivo como entrada.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: