Redirection (informatique) - Redirection (computing)
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 > file1
exé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 < file1
exé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 > outfile
combine 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
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 echo
avec 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 cat
ou 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 echo
c'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>1
cat 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>&1
2>&1
Si la sortie fusionnée doit être redirigée vers un autre programme, la séquence de fusion de fichiers 2>&1
doit 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>&1
command &>file
command >&file
Il est possible d'utiliser 2>&1
avant " >
" 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 2
sur le 1
point vers lequel le handle pointe, qui à ce stade est généralement stdout . Ensuite, " >
" redirige le handle 1
vers 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
- Here-document , un moyen de spécifier le texte à saisir dans les shells de ligne de commande
- Pelletage de coquillages
- Substitution de commandes
- Substitution de processus
Liens externes
- The Single UNIX Specification , Issue 7 de The Open Group : dupliquer un descripteur de fichier ouvert - System Interfaces Reference,
- Définition de la redirection par le Linux Information Project (LINFO)
- Redirection d'E/S dans le projet de documentation Linux
- Redirection sous Windows
- Création d'un processus enfant avec entrée et sortie redirigées dans Windows