Si vous êtes à l'aise avec la redirection de sortie et d'entrée, 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 relié à l'entrée de Command2
et le transfert s'effectue en mémoire.
Ce qui suit est un peu simplifié pour aider les nouveaux utilisateurs.
Eh bien, 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 a une entrée standard (stdin
) et une sortie standard (stdout
). La situation habituelle est que stdin
est votre clavier et stdout
est votre écran ou votre fenêtre de terminal.
Ainsi, lorsque vous exécutez ls
, il lancera sa sortie à stdout
. Si vous ne faites rien d'autre, il ira à votre écran ou à la fenêtre du terminal et vous le visualiserez.
Désormais, certaines commandes Linux interagissent avec l'utilisateur et utilisent stdin
pour ce faire, votre éditeur de texte en fait partie. Il lit à partir de stdin
pour accepter vos frappes, faire des choses, puis écrire des choses dans stdout
.
Cependant, il existe également des commandes non interactives ou "filtre" qui ne fonctionnent PAS de manière interactive, mais qui nécessitent un ensemble de données. Ces commandes prendront tout stdin
a, faites quelque chose, puis lancez-le à stdout
Regardons une autre commande appelée du
- représente l'utilisation du disque. du /usr
, par exemple, imprimera (à stdout
comme toute autre commande Linux) une liste de tous les fichiers de ce répertoire et sa 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 voir dès le départ, il n'est pas trié et vous voulez probablement qu'il soit trié par ordre de taille.
sort
est l'une de ces commandes de "filtre" qui prendra un tas de choses de stdin
et triez-le.
Donc, si nous faisons ceci :
# 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" relie le stdout
d'une commande au stdin
d'un autre. En règle générale, vous l'utiliserez dans des situations comme celle-ci où vous souhaitez filtrer, trier ou manipuler la sortie d'une commande. Ils peuvent être mis en cascade si vous souhaitez traiter la sortie via plusieurs commandes de type filtre.
Si vous tapez sort
par lui-même, il essaiera toujours de lire à partir de stdin
. Depuis stdin
est connecté à votre clavier, il vous attendra pour taper et traiter les choses jusqu'à ce que vous appuyiez sur Control-D. Il ne vous demandera pas car il n'est pas vraiment destiné à être utilisé de manière interactive.
Il est possible qu'un programme dise si stdin
est interactif ou non, certains programmes peuvent donc agir différemment si vous les lancez seuls ou au bout d'un tuyau.
En outre, diriger un programme qui ne fonctionne que de manière interactive, comme vi
, vous fera passer un mauvais moment.
Les canaux sont différents de la redirection en ce sens que les données sont mélangées d'une commande à l'autre sans être stockées nulle part. Ainsi, dans l'exemple ci-dessus, du
La sortie de n'est stockée nulle part. La plupart du temps, vous ne voulez pas cela avec des canaux car la raison d'utiliser des canaux est de traiter la sortie d'une commande d'une manière ou d'une autre - mais il existe une commande tee
qui vous permet d'avoir votre gâteau et de le manger aussi, il copiera ce qu'il reçoit de stdin
aux deux 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 crochets que je ne connais pas.
Vraiment, si vous voulez savoir ce que font les pipes et la différence entre> et |, alors allez dans un répertoire avec beaucoup de fichiers, et
depuis un terminal ls
contre ls | more
(ou le faire depuis Windows avec DIR et DIR | MORE)
Si vous avez utilisé> more, vous verrez qu'il crée un fichier appelé 'more' plutôt que d'envoyer la sortie de ls à la commande 'more'. Donc, si quelqu'un en faisait> plus, ce serait probablement une erreur, on ne ferait pas> plus que vous feriez> file1. More est une commande bien connue.
Le
$ grep a
$ fichier chat1 | grep aabc
grep avec 2 paramètres se présente sous la forme d'un fichier de modèle grep. grep avec un paramètre est grep pattern. Et vous pouvez lui envoyer le fichier en y transférant le contenu du fichier ou en utilisant <. Si vous utilisez <, vous écrivez d'abord le nom de la commande, puis le nom du fichier après la commande
De plus, de nombreuses commandes prennent de toute façon un fichier en entrée, donc grep a file1 fonctionnera, tout comme cat file1 | grep un, et grep un
Je faisais des pipes (|) et> sur DOS il y a même 15 ans.
Pour résumer comment | diffère de