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.