que signifie la connexion de STDOUT et de STDIN?

10

Je lis un livre, ça dit:

Chaque processus dispose d'au moins trois canaux de communication: «entrée standard» (STDIN), «sortie standard» (STDOUT) et «erreur standard» (STDERR).

La plupart des commandes acceptent leur entrée de STDIN et écrivent leur sortie dans STDOUT. Ils écrivent des messages d'erreur à STDERR. Cette convention vous permet de chaîner des commandes comme des blocs de construction pour créer des pipelines composites.

Le shell interprète les symboles <, >et >>comme des instructions pour rediriger l'entrée ou la sortie d'une commande vers ou depuis un fichier.

Pour connecter le STDOUT d'une commande au STDIN d'une autre, utilisez le | symbole, communément appelé pipe.

ps -ef | grep httpd

Donc, fondamentalement, ce que cela signifie, c'est que l'entrée standard est une commande qui permet à l'utilisateur d'écrire dans un fichier, tandis que la sortie standard est une commande qui a la sortie d'écriture du shell bash dans le shell, et l'erreur standard est exactement comme la sortie, mais ce n'est que invoqué en cas d'erreur dans le système de fichiers. Ensuite, nous arrivons à la partie de la connexion STDOUT et STDIN et je suis perdu.

JohnMerlino
la source

Réponses:

25

L'entrée et la sortie standard ne sont pas des commandes.

Imaginez des commandes comme des machines dans une usine avec une chaîne de montage. La plupart des machines sont conçues pour avoir une bande transporteuse pour alimenter les données et une bande transporteuse pour extraire les données; ce sont respectivement l'entrée standard et la sortie standard. L'erreur standard est une ouverture sur le côté de la machine où elle peut éjecter les rejets.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

Le diagramme ci-dessus montre une bande transporteuse qui traverse deux machines. Les données proviennent du réservoir d'entrée à gauche, sont transmises à la machine A, puis la sortie est acheminée vers la machine B (pour laquelle elle est entrée), et la sortie de la machine B est déposée dans le godet de sortie à droite.

En termes Unix, cela s'appelle un pipeline . La métaphore est celle de la plomberie: un tuyau relie la machine A à la machine B. La syntaxe du shell pour le pipeline ci-dessus est

<input-file.txt commandA | commandB >output-file.txt

Le symbole de < redirection indique au shell de connecter commandAl'entrée standard du fichier input-file.txtavant le lancement commandA. (Vous pouvez placer la redirection avant ou après le nom de la commande.) Le >symbole de redirection indique au shell de connecter commandBla sortie standard de output-file.txt. Le |symbole de tuyau (" ") au milieu indique au shell de connecter commandAla sortie commandBstandard de l'entrée standard avant de les lancer.

Les commandes peuvent avoir plus d'une entrée et plus d'une sortie, mais c'est du matériel pour un autre jour .

Gilles 'SO- arrête d'être méchant'
la source
3
Le visuel a beaucoup aidé
JohnMerlino
Belle analogie. Je comprends le concept de pipeline de flux depuis de nombreuses années maintenant, mais personne n'a jamais utilisé l'analogie usine / convoyeur, ce qui le rend très facilement (et succinctement) compréhensible. Je vous remercie!
Owen Blacker
1
Grande analogie. Je vais emprunter celui-ci si cela ne vous dérange pas.
Tivie
Gilles, j'ai posé une question sur votre phrasé en bas: unix.stackexchange.com/q/96724/29146 . pourriez-vous clarifier?
strugee
@Gilles - Pouvez-vous inclure un exemple qui illustre l'option de définir la redirection avant ou après la commande? Par exemple, le pipeline peut-il lire comme fichier d'entrée.txt> commandA ou fichier d'entrée.txt <commandeA?
Motivé
6

standard input is a command that allows user to write to a file

Pas une commande, mais un flux. Les entrées et sorties standard sont comme des boîtes aux lettres. Lorsqu'un programme démarre, on lui donne une boîte pour recevoir et une boîte pour envoyer du courrier. Habituellement, la saisie provient du clavier et est placée dans la boîte de réception, le courrier mis dans la boîte de sortie se retrouve sur l'écran de votre terminal.

standard output is a command that has the bash shell write output to the shell

Le programme ne sait pas vraiment où les points de sortie standard. Lorsque vous dirigez A vers B (comme dans $ A | B), lorsque A met du courrier dans la boîte d'envoi, il se retrouve dans la boîte de réception de B. B traite l'entrée et met son propre courrier dans la boîte d'envoi, ce que vous voyez sur le terminal.

Pour supprimer la métaphore, comme mentionné, les entrées / sorties standard sont des flux. La boîte aux lettres, ou descripteur de fichier , est une extrémité du flux. Tuyau, c'est connecter la norme de A à la norme de B.

Splinter of Chaos
la source