Points clés à retenir
- Les commandes Linux créent trois flux de données (stdin, stdout et stderr) qui peuvent être utilisés pour transférer des données sur une commande.
- stdin est le flux d’entrée, stdout est le flux de sortie et stderr est le flux d’erreurs sous Linux.
- La redirection vous permet de rediriger la sortie ou les erreurs vers différentes destinations, telles que des fichiers ou des canaux.
stdin
, stdout
et stderr
sont trois flux de données créés lorsque vous lancez une commande Linux. Vous pouvez les utiliser pour savoir si vos scripts sont redirigés ou redirigés. Nous vous montrons comment.
Les flux rejoignent deux points
Dès que vous commencerez à vous renseigner sur les systèmes d’exploitation Linux et de type Unix, vous rencontrerez les termes stdin
, stdout
et stederr
. Ceux-ci sont trois flux standards qui sont établis lorsqu’une commande Linux est exécutée. En informatique, un flux est quelque chose qui peut transférer des données. Dans le cas de ces flux, ces données sont du texte.
Les flux de données, comme les flux d’eau, ont deux extrémités. Ils ont une source et une sortie. Quelle que soit la commande Linux que vous utilisez, elle fournit une extrémité de chaque flux. L’autre extrémité est déterminée par le shell qui a lancé la commande. Cette extrémité sera connectée à la fenêtre du terminal, connectée à un tube ou redirigée vers un fichier ou une autre commande, selon la ligne de commande qui a lancé la commande.
Les flux standard Linux : stdin, stdout, stderr
Sous Linux, stdin
est le flux d’entrée standard. Cela accepte le texte comme entrée. La sortie texte de la commande vers le shell est transmise via le stdout
(sortie standard). Les messages d’erreur de la commande sont envoyés via le stderr
(erreur standard).
Vous pouvez donc voir qu’il y a deux flux de sortie, stdout
et stderr
et un flux d’entrée, stdin
. Étant donné que les messages d’erreur et les sorties normales ont chacun leur propre canal pour les acheminer vers la fenêtre du terminal, ils peuvent être traités indépendamment les uns des autres.
Les flux sont traités comme des fichiers
Les flux sous Linux — comme presque tout le reste — sont traités comme s’il s’agissait de fichiers. Vous pouvez lire du texte à partir d’un fichier et écrire du texte dans un fichier. Ces deux actions impliquent un flux de données. Ainsi, le concept de gestion d’un flux de données sous forme de fichier n’est pas si exagéré.
Chaque fichier associé à un processus se voit attribuer un numéro unique pour l’identifier. C’est ce qu’on appelle le descripteur de fichier. Chaque fois qu’une action doit être effectuée sur un fichier, le descripteur de fichier est utilisé pour identifier le fichier.
Ces valeurs sont toujours utilisées pour stdin
, stdout,
et stderr
:
- 0 : entrée standard
- 1 : sortie standard
- 2 : stderr
Réagir aux tuyaux et aux redirections
Pour faciliter l’introduction d’un sujet à quelqu’un, une technique courante consiste à enseigner une version simplifiée du sujet. Par exemple, en grammaire, on nous dit que la règle est « I avant E, sauf après C ». Mais en fait, là sont d’autres exceptions à cette règle qu’il y a des cas qui y obéissent.
Dans le même ordre d’idées, lorsqu’on parle de stdin
, stdout
et stderr
il est commode de répéter l’axiome accepté selon lequel un processus ne sait pas et ne se soucie pas de l’endroit où se terminent ses trois flux standards. Un processus doit-il se soucier de savoir si sa sortie va au terminal ou est redirigée vers un fichier ? Peut-il même savoir si sa saisie provient du clavier ou si elle y est transmise depuis un autre processus ?
En fait, un processus sait – ou du moins il peut le découvrir s’il choisit de vérifier – et il peut modifier son comportement en conséquence si l’auteur du logiciel décide d’ajouter cette fonctionnalité.
Nous pouvons constater ce changement de comportement très facilement. Essayez ces deux commandes :
ls
ls | cat
Le ls
la commande se comporte différemment si sa sortie (stdout
) est redirigé vers une autre commande. C’est ls
qui passe à une sortie à une seule colonne, ce n’est pas une conversion effectuée par cat
. Et ls
fait la même chose si sa sortie est redirigée :
ls > capture.txt