Redirection (informatique) - Redirection (computing)

Les flux standard pour l'entrée, la sortie et l'erreur

En informatique , la redirection est une forme de communication interprocessus et une fonction commune à la plupart des interpréteurs de ligne de commande , y compris les divers shells Unix qui peuvent rediriger les flux standard vers des emplacements spécifiés par l'utilisateur.

Dans les systèmes d'exploitation de type Unix, les programmes effectuent la redirection avec l' appel système dup2 (2) , ou ses analogues stdio moins flexibles mais de niveau supérieur , freopen (3) et popen (3) .

Rediriger l'entrée standard et la sortie standard

La redirection est généralement implémentée en plaçant certains caractères entre les commandes .

De base

En règle générale, la syntaxe de ces caractères est la suivante, à l'aide de <pour rediriger l'entrée et >pour rediriger la sortie. command > file1exécute command1 , plaçant la sortie dans file1 , au lieu de l'afficher sur le terminal, qui est la destination habituelle de la sortie standard. Cela écrasera toutes les données existantes dans file1 .

L'utilisation command < file1exécute command1 , avec file1 comme source d'entrée, par opposition au clavier , qui est la source habituelle pour l'entrée standard.

command < infile > outfilecombine les deux capacités : command1 lit dans le fichier infile et écrit dans le fichier out

Variantes

Pour ajouter la sortie à la fin du fichier, plutôt que de l'écraser, l' >>opérateur est utilisé : command1 >> file1.

Pour lire à partir d'un littéral de flux (un fichier en ligne, passé à l'entrée standard), on peut utiliser un document here , en utilisant l' <<opérateur :

$ tr a-z A-Z << END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES

Pour lire à partir d'une chaîne, on peut utiliser une chaîne here , en utilisant l' <<<opérateur : , ou : tr a-z A-Z <<< "one two three"

$ NUMBERS="one two three"
$ tr a-z A-Z <<< "$NUMBERS"
ONE TWO THREE

Tuyauterie

Un pipeline de trois programmes exécutés sur un terminal texte

Les programmes peuvent être exécutés ensemble de telle sorte qu'un programme lise la sortie d'un autre sans avoir besoin d'un fichier intermédiaire explicite. exécute command1 , en utilisant sa sortie comme entrée pour command2 (communément appelé pipe , le caractère " " étant connu sous le nom de " pipe "). command1 | command2|

Les deux programmes exécutant les commandes peuvent s'exécuter en parallèle, le seul espace de stockage étant les tampons de travail (Linux autorise jusqu'à 64 Ko pour chaque tampon) plus l'espace de travail requis par le traitement de chaque commande. Par exemple, une commande "sort" est incapable de produire une sortie tant que tous les enregistrements d'entrée n'ont pas été lus, car le tout dernier enregistrement reçu peut s'avérer être le premier dans l'ordre trié. Le système d'exploitation expérimental du Dr Alexia Massalin, Synthesis , ajusterait la priorité de chaque tâche au fur et à mesure de leur exécution en fonction de la plénitude de leurs tampons d'entrée et de sortie.

Cela produit le même résultat final que l'utilisation de deux redirections et d'un fichier temporaire, comme dans :

$ command1 > tempfile
$ command2 < tempfile
$ rm tempfile

Mais ici, command2 ne commence pas à s'exécuter tant que command1 n'est pas terminé, et un fichier de travail suffisamment volumineux est requis pour contenir les résultats intermédiaires ainsi que l'espace de travail requis par chaque tâche. A titre d'exemple, bien que DOS autorise la syntaxe "pipe", il utilise cette seconde approche. Ainsi, supposons qu'un programme de longue durée "Worker" produise divers messages pendant qu'il fonctionne et qu'un deuxième programme, TimeStamp, copie chaque enregistrement de stdin à stdout , préfixé par la date et l'heure du système lorsque l'enregistrement est reçu. Une séquence telle que produirait des horodatages uniquement lorsque Worker avait terminé, montrant simplement à quelle vitesse son fichier de sortie pouvait être lu et écrit. Worker | TimeStamp > LogFile.txt

Un bon exemple de canalisation de commandes consiste à combiner echoavec une autre commande pour réaliser quelque chose d'interactif dans un shell non interactif, par exemple . Cela lance le client ftp avec l' utilisateur d' entrée , appuyez sur retour , puis passez . echo -e 'user\npass' | ftp localhost

Dans une utilisation occasionnelle, l'étape initiale d'un pipeline est souvent catou echo, la lecture à partir d'un fichier ou d'une chaîne. Cela peut souvent être remplacé par une indirection d'entrée ou une chaîne here , et l'utilisation de cat et de tuyauterie plutôt que la redirection d'entrée est connue comme une utilisation inutile de cat . Par exemple, les commandes suivantes :

$ cat infile | command
$ echo $string | command
$ echo -e 'user\npass' | ftp localhost

peut être remplacé par :

$ command < infile
$ command <<< $string
$ ftp localhost <<< $'user\npass'

Comme echoc'est souvent une commande interne au shell, son utilisation n'est pas aussi critiquée que cat, qui est une commande externe.

Redirection vers et depuis les descripteurs de fichiers standard

Dans les shells Unix dérivés du shell Bourne original , les deux premières actions peuvent être encore modifiées en plaçant un nombre (le descripteur de fichier ) juste avant le caractère ; cela affectera le flux utilisé pour la redirection. Les flux d'E/S standard Unix sont :

Manipuler Nom La description
0 standard Entrée standard
1 sortie standard Sortie standard
2 stderr Erreur standard

Par exemple, exécute la commande , dirigeant le flux d' erreurs standard vers file1 . command 2> file1

Dans les shells dérivés de csh (le shell C ), la syntaxe ajoute à la place le caractère & (esperluette) aux caractères de redirection, obtenant ainsi un résultat similaire. La raison en est de faire la distinction entre un fichier nommé '1' et stdout, c'est-à-dire vs . Dans le premier cas, stderr est redirigé vers un fichier nommé ' 1 ' et dans le second, stderr est redirigé vers stdout. cat file 2>1cat file 2>&1

Une autre fonctionnalité utile consiste à rediriger un descripteur de fichier standard vers un autre. La variante la plus courante consiste à fusionner l'erreur standard dans la sortie standard afin que les messages d'erreur puissent être traités avec (ou alternativement) la sortie habituelle. Par exemple, essaiera de trouver tous les fichiers nommés .profile . Exécuté sans redirection, il affichera les hits vers stdout et les erreurs (par exemple, faute de privilège pour traverser les répertoires protégés) vers stderr . Si la sortie standard est dirigée vers le fichier results , des messages d'erreur s'affichent sur la console. Pour voir à la fois les résultats et les messages d'erreur dans les résultats du fichier , fusionnez stderr (handle 2) dans stdout (handle 1) à l'aide de . find / -name .profile > results 2>&12>&1

Si la sortie fusionnée doit être redirigée vers un autre programme, la séquence de fusion de fichiers 2>&1doit précéder le symbole du tube, ainsi,find / -name .profile 2>&1 | less

Une forme simplifiée mais non conforme à POSIX de la commande est (non disponible dans Bourne Shell avant la version 4, version finale, ou dans le shell standard Debian Almquist utilisé dans Debian/Ubuntu) : ou . command > file 2>&1command &>filecommand >&file

Il est possible d'utiliser 2>&1avant " >" mais le résultat est souvent mal compris. La règle est que toute redirection définit indépendamment le descripteur du flux de sortie. Donc " 2>&1" définit le handle 2sur le 1point vers lequel le handle pointe, qui à ce stade est généralement stdout . Ensuite, " >" redirige le handle 1vers quelque chose d'autre, par exemple un fichier , mais cela ne change pas le handle 2, qui pointe toujours vers stdout .

Dans l'exemple suivant, la sortie standard est écrite dans le fichier , mais les erreurs sont redirigées de stderr vers stdout, c'est-à-dire envoyées à l'écran : . command 2>&1 > file

Pour écrire à la fois les erreurs et la sortie standard dans le fichier , l'ordre doit être inversé. La sortie standard serait d'abord redirigée vers le fichier, puis stderr serait également redirigé vers le descripteur stdout qui a déjà été modifié pour pointer vers le fichier : . command > file 2>&1

Pipelines chaînés

Les jetons de redirection et de canalisation peuvent être enchaînés pour créer des commandes complexes. Par exemple, trie les lignes d' infile dans l'ordre lexicographique, écrit des lignes uniques préfixées par le nombre d'occurrences, trie numériquement la sortie résultante et place la sortie finale dans outfile . Ce type de construction est très couramment utilisé dans les scripts shell et les fichiers batch . sort infile | uniq -c | sort -n > outfile

Rediriger vers plusieurs sorties

Le tee de commande standard peut rediriger la sortie d'une commande vers plusieurs destinations : . Cela dirige la sortie de la liste de fichiers vers la sortie standard et le fichier xyz . ls -lrt | tee xyz

Voir également

Liens externes