Voici une commande qui trie les fichiers d'un dossier dans l'ordre inverse
ls | sort -r
Que fait le symbole |
dans cette commande?
Ce que je recherche vraiment ici 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 n’entraîne une réponse expliquant simplement ce qu’elles font et en quoi elles diffèrent de la redirection (le symbole >
ou <
).
Ce qui suit est un peu simplifié pour aider les nouveaux utilisateurs.
Eh bien, 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 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 jettera sa sortie sur stdout
. Si vous ne faites rien d’autre, il s’affichera sur votre écran ou votre terminal.
Désormais, certaines commandes Linux interagissent avec l'utilisateur et utilisent stdin
pour ce faire, votre éditeur de texte étant l'un d'entre eux. Il lit dans stdin
pour accepter vos frappes au clavier, faire des choses, puis écrit des éléments 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 tas de données. Ces commandes vont prendre tout ce que stdin
a, y faire quelque chose, puis le jeter à stdout
Regardons une autre commande appelée du
- représente l’utilisation du disque. du /usr
, par exemple, affichera (à 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 constater dès le départ, les données ne sont pas triées et vous souhaitez probablement les trier par ordre de taille.
sort
est l’une de ces commandes "filter" qui prendront un tas de choses de stdin
et les trier.
Donc, si on fait ça:
# du /usr | sort -nr
nous obtenons 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 la stdout
d'une commande à la stdin
d'une autre. En règle générale, vous l'utiliserez dans des situations telles que celle où vous souhaitez filtrer, trier ou manipuler d'une autre manière 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 tentera toujours de lire à partir de stdin
. Puisque stdin
est connecté à votre clavier, il attend que vous tapiez et traitiez les choses jusqu'à ce que vous appuyiez sur Ctrl-D. Cela ne vous y invitera pas car ce n'est pas vraiment fait pour être utilisé de manière interactive.
Il est possible qu'un programme dise si stdin
est interactif ou non. Par conséquent, certains programmes peuvent agir différemment si vous les publiez eux-mêmes ou à la fin d'un tuyau.
En outre, si vous programmez un programme qui ne fonctionne que de manière interactive, comme vi
, vous passerez un mauvais moment.
Les pipes diffèrent de la redirection en ce sens que les données sont brassées d'une commande à l'autre sans être stockées nulle part. Ainsi, dans l'exemple ci-dessus, la sortie de du
n'est pas stockée nulle part. La plupart du temps, vous ne le souhaitez pas avec les pipes, parce que la raison d'utiliser ces pipes 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 de prendre votre gâteau et de le manger aussi. copie ce qu'il reçoit de stdin
dans stdout
et dans un fichier de votre choix. Vous pouvez aussi probablement le faire à partir de bash
avec une syntaxe mystérieuse impliquant des esperluettes et des crochets que je ne connais pas.
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ée à l'entrée de Command2
et le transfert s'effectue en mémoire.
Vraiment, si vous voulez savoir ce que font les pipes et la différence entre> et |, allez dans un répertoire avec beaucoup de fichiers, et
depuis un terminal ls
vs ls | more
(ou 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 le résultat de ls à la commande "more". Donc, si quelqu'un faisait> plus, ce serait probablement une erreur, on ne ferait pas> plus, vous feriez> fichier1. Plus est une commande bien connue.
Le <comme le> sert également à lier une commande et un fichier, plutôt qu’une commande à une commande. Mais alors que> envoie la sortie d'une commande à un fichier, le <envoie un fichier en tant qu'entrée à une commande. J'utilise rarement <comme j'utilise habituellement cat file1 | envoyer la sortie d'un fichier à une commande.
$ grep un <fichier1 abc
$ cat file1 | grep a abc
grep avec 2 paramètres est de la forme fichier de motif grep. grep avec un paramètre est le motif grep. Et vous pouvez lui envoyer le fichier en lui passant 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 <file. Si vous utilisez | pour diriger le contenu d'un fichier, utilisez cat file1 | commander.
De plus, de nombreuses commandes prennent quand même un fichier en entrée, donc grep un fichier1 fonctionnera, tout comme cat file1 | grep a et grep a <fichier1.
Je faisais des pipes (|) et> sur DOS il y a 15 ans.
Pour résumer comment | diffère de <et> - Le tuyau est situé entre 2 commandes. Les <et> sont assis entre une commande et un fichier. Le> est sorti dans un fichier. Le <est une entrée d'un fichier.
Le caractère de canal (|
) connecte la sortie d'un programme à l'entrée d'un autre.
Dans cet exemple, echo
imprime le mot hello
et wc -c
fait un nombre de caractères de son entrée:
echo hello | wc -c
Pour comprendre cela, essayez vous-même:
sort -r
Maintenant, vous êtes 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, non? Maintenant, appuyez sur ctrl + d
5
4
3
2
1
Ainsi, quelle sorte est, il prend une entrée (ce que vous avez tapé), fait quelque chose avec elle (une sorte) et le restitue en sortie. La commande ls
ne prend pas d'entrée, elle génère uniquement une sortie. Le symbole de canal extrait le résultat de ls
et le transmet en tant qu'entrée de la commande sort
.
>
ne transmet pas la sortie à un programme, mais stocke la sortie sous forme de fichier. <
utilise un fichier comme entrée.