22 votes

A quoi sert le symbole du tuyau "|" dans Linux ?

Voici une commande qui trie les fichiers d'un dossier en ordre inverse

ls | sort -r

Que fait le | dans cette commande ?

Ce que je recherche vraiment ici, c'est une explication de haut niveau (facile à comprendre) des tuyaux pour les débutants sous Linux. Je vois d'autres questions sur les pipes ici sur Superuser, mais rien qui ne suscite une réponse qui explique en termes simples ce qu'ils font et en quoi ils diffèrent de la redirection (la fonction > ou < symbole).

29voto

Daniel B Points 52129

Si vous êtes à l'aise avec la redirection des entrées et des sorties, l'explication est vraiment très simple.

Command1 | Command2

fait la même chose que

Command1 > tempfile
Command2 < tempfile

mais sans tempfile . La sortie de Command1 est directement connecté à l'entrée de Command2 et le transfert se fait en mémoire.

27voto

LawrenceC Points 70381

Ce qui suit est un peu simplifié pour aider les nouveaux utilisateurs.

Tout d'abord, il est nécessaire de comprendre le concept d'entrée standard et de sortie standard.

Sous Linux et d'autres systèmes d'exploitation de type UNIX, chaque processus dispose d'une entrée standard ( stdin ) et une sortie standard ( stdout ). La situation habituelle est la suivante stdin est votre clavier et stdout est votre écran ou votre fenêtre de terminal.

Donc quand vous exécutez ls il enverra sa sortie à stdout . Si vous ne faites rien d'autre, il s'affichera sur votre écran ou dans une fenêtre de terminal, et vous pourrez le visualiser.

Maintenant, certaines commandes Linux interagissent avec l'utilisateur, et utilisent stdin pour le faire, votre éditeur de texte étant l'un d'entre eux. Il lit à partir de stdin pour accepter tes frappes, faire des choses, et ensuite écrire des choses sur stdout .

Cependant, il existe aussi des commandes non interactives ou "filtres" qui ne fonctionnent PAS de manière interactive, mais qui veulent un tas de données. Ces commandes prendront tout stdin a, lui faire quelque chose, et ensuite le lancer à stdout

Regardons une autre commande appelée du - représente l'utilisation du disque. du /usr par exemple, s'imprimera (à stdout comme toute autre commande Linux) une liste de tous les fichiers de ce répertoire et leur taille :

# 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

Comme vous pouvez le constater dès le départ, il n'est pas trié, et vous souhaitez probablement le trier par ordre de taille.

sort est une de ces commandes de "filtre" qui prend un tas de choses à partir de stdin et le trier.

Donc, si on fait ça :

# du /usr | sort -nr

on obtient ceci, qui est un peu mieux :

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

Et vous pouvez maintenant voir que le "tuyau" connecte le stdout d'une commande à l'autre stdin d'un autre. En général, vous l'utiliserez dans des situations comme celle-ci, lorsque vous souhaitez filtrer, trier ou manipuler d'une autre manière la sortie d'une commande. Ils peuvent être utilisés en cascade si vous souhaitez traiter la sortie par le biais de plusieurs commandes de type filtre.

Si vous tapez sort par lui-même, il essaiera toujours de lire à partir de stdin . Puisque stdin est connecté à votre clavier, il attendra que vous tapiez, et traitera les choses jusqu'à ce que vous appuyiez sur Control-D. Il ne vous invitera pas à le faire, car il n'est pas vraiment destiné à être utilisé de manière interactive.

Il est possible pour un programme de dire si stdin est interactive ou non, donc certains programmes peuvent agir différemment si vous les émettez seuls ou à la fin d'un tuyau.

De même, il faut pipeter un programme qui ne fonctionne que de manière interactive, comme vi vous fera passer un mauvais moment.

Les pipes sont différents de la redirection en ce sens que les données sont déplacées d'une commande à l'autre sans être stockées nulle part. Donc, dans l'exemple ci-dessus, du n'est stockée nulle part. La plupart du temps, vous ne voulez pas cela avec les pipes car la raison d'utiliser les pipes est de traiter la sortie d'une commande d'une manière ou d'une autre - mais, il y a une commande tee qui vous laisse avoir le beurre et l'argent du beurre, il copiera ce qu'il reçoit de stdin à la fois stdout et un fichier de votre choix. Vous pouvez aussi probablement le faire à partir de bash avec une syntaxe obscure impliquant des esperluettes et des parenthèses que je ne connais pas.

3voto

barlop Points 21549

Vraiment, si vous voulez savoir ce que font les tuyaux et la différence entre > et |, allez dans un répertoire avec beaucoup de fichiers, et

à partir d'un terminal ls vs ls | more (ou le faire à partir de Windows avec DIR et DIR | MORE)

Si vous avez utilisé > more, vous verrez qu'il crée un fichier appelé 'more' au lieu d'envoyer la sortie de ls à la commande 'more'. Donc si quelqu'un a utilisé >more, c'est probablement une erreur, on ne ferait pas >more mais >file1. More est une commande bien connue.

Le < comme le > sert aussi à lier une commande et un fichier, plutôt qu'une commande à une commande. Mais alors que > envoie la sortie d'une commande vers un fichier, le < envoie un fichier en entrée d'une commande. J'utilise rarement < car j'utilise généralement cat file1 | pour envoyer la sortie d'un fichier à une commande.

$ grep a < fichier1 abc

$ cat file1 | grep a abc

grep avec 2 paramètres est de la forme grep pattern file. grep avec un paramètre est grep pattern. Si vous utilisez <, vous écrivez le nom de la commande en premier, puis le nom du fichier après, donc commande < fichier. Si vous utilisez | pour envoyer le contenu d'un fichier, vous utilisez la commande cat file1 |.

De plus, de nombreuses commandes prennent un fichier en entrée, donc grep a file1 fonctionnera, tout comme cat file1 | grep a, et grep a < file1.

Je faisais des pipes (|) et des > sous DOS il y a encore 15 ans.

Pour résumer comment | diffère de < et > -. Le tuyau se trouve entre 2 commandes Le < et le > se trouvent entre une commande et un fichier. Le > est la sortie vers un fichier. Le < est l'entrée d'un fichier.

3voto

bbaassssiiee Points 1345

Le caractère pipe ( | ) relie la sortie d'un programme à l'entrée d'un autre.

Dans cet exemple echo imprime le mot hello y wc -c fait un comptage des caractères de son entrée :

echo hello | wc -c

2voto

jornane Points 1055

Pour le comprendre, essayez vous-même :

sort -r

Maintenant tu es suspendu avec un curseur, et il ne fait rien. Que se passe-t-il si vous tapez des données ?

1
2
3
5
4

Toujours rien, hein ? Maintenant, appuyez sur ctrl+D

5
4
3
2
1

Donc, ce que le tri fait, c'est qu'il prend l'entrée (ce que vous avez tapé), fait quelque chose avec (trie) et le renvoie comme sortie. Le site ls ne prend pas d'entrée, elle ne fait que générer une sortie. Le symbole pipe prend la sortie de ls et l'utilise comme entrée pour le sort commandement.

> n'envoie pas la sortie à un programme, mais stocke la sortie dans un fichier. < utilise un fichier comme entrée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X