Cette question a déjà une réponse ici:
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 qui suscite une réponse expliquant simplement ce qu’elles font et en quoi elles diffèrent de la redirection (le symbole >
ou <
).
linux
command-line
bash
pipe
ccalvert
la source
la source
|
est qu’elle n’utilise pas de nom. La sortie de la commande à main gauche est directement transmise à l’entrée de la commande située du côté droit du tuyau.ls -1r
(Notez le premier argument) devrait produire un résultat similaire àls | sort -r
.cat /somefile | grep cool
. Cela prendra la sortie de somefile et le rendra disponible pour grep, puis grep imprimera toutes les lignes contenant le mot cool.Réponses:
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 celle destdin
votre clavier et celle destdout
votre écran ou de votre terminal.Ainsi, lorsque vous exécutez
ls
, il renvoie sa sortie à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 l'utilisent
stdin
, notamment l'éditeur de texte. Il lit à partir destdin
pour accepter vos frappes au clavier, faire des choses, puis écrit des choses à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 qu’il
stdin
a, 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:Comme vous pouvez le constater dès le départ, il n’est pas trié et vous souhaitez probablement le faire par ordre de taille.
sort
est l’une de ces commandes "filter" qui vont prendre un tas de chosesstdin
et les trier.Donc, si on fait ça:
# du /usr | sort -nr
nous obtenons ceci, qui est un peu mieux:
Et vous pouvez maintenant voir que le "tuyau" connecte la
stdout
commande d'une commande à la commandestdin
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 de toute 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
seul, il essaiera toujours de lirestdin
. Puisquestdin
est connecté à votre clavier, il attendra que vous tapiez et traitiez les choses jusqu'à ce que vous appuyiez sur Ctrl-D. Cela ne vous le demandera pas car ce n'est pas vraiment fait pour être utilisé de manière interactive.Il est possible qu'un programme indique s'il
stdin
est interactif ou non. Certains programmes peuvent donc 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, vous
vi
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,
du
la sortie de n'est pas stockée nulle part. La plupart du temps, vous ne le souhaitez pas avec les pipes, car l’utilisation des pipes a pour but de traiter la sortie d’une commande, mais il existe une commandetee
qui vous permet d’avoir votre gâteau et de le manger aussi. copier ce qu’il reçoitstdin
dans les deuxstdout
fichiers et dans un fichier de votre choix. Vous pouvez aussi probablement le fairebash
avec une syntaxe mystérieuse impliquant des esperluettes et des crochets que je ne connais pas.la source
stdin
etstdout
est différent sous Windows de celui sous Linux, bien que probablement pas beaucoup du point de vue de Windowscmd.exe
ou de Powershell.GetStdHandle()
. Il est également simple de rediriger les flux standard d'un processus [enfant] engendré avec .NET, qui, je crois, mappe aux fonctions Win32 (mais je ne suis pas sûr à 100% de cela - je ne suis pas un dev Win32).STARTUPINFO
structure pourCreateProcess()
.Si vous êtes à l'aise avec la redirection des entrées et des sorties, l'explication est vraiment très simple.
fait la même chose que
mais sans
tempfile
. La sortie deCommand1
est directement connectée à l'entrée deCommand2
et le transfert s'effectue en mémoire.la source
CreateFile
ouWriteFile
appelle à sauvegarder votre réclamation. / edit: C'est pour la partie Windows, bien sûr.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
contrels | more
(ou depuis 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 tube est situé entre 2 commandes. Les <et> sont situés entre une commande et un fichier. Le> est sorti dans un fichier. Le <est une entrée d'un fichier.
la source
Le caractère de canal (
|
) connecte la sortie d'un programme à l'entrée d'un autre.Dans cet exemple,
echo
le mot est impriméhello
etwc -c
compte le nombre de caractères de son entrée:la source
Pour comprendre cela, essayez vous-même:
Maintenant, vous êtes avec un curseur, et il ne fait rien. Que se passe-t-il si vous tapez des données?
Toujours rien, non? Maintenant, appuyez sur ctrl + d
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
ls
commande ne prend pas d'entrée, elle génère seulement une sortie. Le symbole de canal prend la sortie dels
et l’alimente en entrée de lasort
commande.>
ne transmet pas la sortie à un programme, mais stocke la sortie sous forme de fichier.<
utilise un fichier comme entrée.la source