La redirection des entrées et des sorties est une fonction naturelle de tout langage de programmation ou de script. Techniquement, cela se produit intrinsèquement chaque fois que vous interagissez avec un ordinateur. L'entrée est lue à partir de stdin
(entrée standard, généralement votre clavier ou votre souris), la sortie va à stdout
(sortie standard, un flux de texte ou de données) et les erreurs sont envoyées à stderr
. Comprendre que ces flux de données existent vous permet de contrôler où vont les informations lorsque vous utilisez un shell, tel que Bash ou Zsh.
L'entrée standard, la sortie standard et l'erreur standard existent en tant qu'emplacements de système de fichiers sous Linux. Vous pouvez les voir dans /dev
:
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
Vous ne pouvez pas faire grand-chose avec eux directement, mais il est parfois utile de les considérer comme des méta-emplacements où vous pouvez envoyer des données.
Les bases de la redirection sont simples :utilisez un certain nombre de >
caractères pour rediriger la sortie, et un certain nombre de <
caractères pour rediriger l'entrée.
Redirection de la sortie
Pour écrire la sortie de la commande ls dans un fichier :
$ ls > list.txt
Vous ne voyez pas la sortie de ls
comme vous le feriez normalement, car la sortie est écrite dans le list.txt
fichier au lieu de votre écran. C'est si polyvalent, en fait, que vous pouvez même l'utiliser pour copier le contenu d'un fichier dans un autre. Il ne doit pas non plus s'agir d'un fichier texte. Vous pouvez utiliser la redirection pour les données binaires :
$ cat image.png > picture.png
(Au cas où vous vous demanderiez pourquoi vous voudriez faire cela, c'est pour une répercussion parfois utile sur les autorisations de fichiers.)
Redirection de l'entrée
Vous pouvez également rediriger l'entrée "vers" une commande. C'est sans doute moins utile que de rediriger la sortie car de nombreuses commandes sont déjà codées en dur pour prendre l'entrée d'un argument que vous fournissez. Cela peut être utile, cependant, lorsqu'une commande attend une liste d'arguments, et que vous avez ces arguments dans un fichier et que vous souhaitez les "copier et coller" rapidement du fichier dans votre terminal (sauf que vous ne voulez pas réellement copier et coller):
$ sudo dnf install $(<package.list)
Les utilisations courantes de la redirection d'entrée sont le ici-document (ou juste ici-doc pour faire court) et chaîne-ici techniques. Cette méthode d'entrée redirige un bloc de texte dans le flux d'entrée standard, jusqu'à un marqueur spécial de fin de fichier (la plupart des gens utilisent EOF
, mais il peut s'agir de n'importe quelle chaîne que vous pensez être unique). Essayez de taper ceci (jusqu'à la deuxième instance de EOF
) dans un terminal :
$ echo << EOF
> foo
> bar
> baz
> EOF
Le résultat attendu :
foo
bar
baz
Un ici-doc est une astuce couramment utilisée par les scripteurs Bash pour vider plusieurs lignes de texte dans un fichier ou sur l'écran. Tant que vous n'oubliez pas de terminer la clause avec votre marqueur de fin de fichier, c'est un moyen efficace d'éviter les listes lourdes de echo
ou printf
déclarations.
Une chaîne ici est similaire à un ici-doc , mais il se compose d'une seule chaîne (ou de plusieurs chaînes déguisées en une seule chaîne avec des guillemets) :
$ cat <<< "foo bar baz"
foo bar baz
Redirection des messages d'erreur
Les messages d'erreur sont dirigés vers un flux appelé stderr
, désigné par 2>
à des fins de redirection. Cette commande dirige les messages d'erreur vers un fichier appelé output.log
:
$ ls /nope 2> output.log
Envoi de données à /dev/null
En savoir plus sur Bash
- Aide-mémoire de Bash
- Une introduction à la programmation avec Bash
- Guide de l'administrateur système sur les scripts Bash
- Derniers articles sur Bash
Tout comme il existe des emplacements pour l'entrée standard, la sortie standard et l'erreur, il existe également un emplacement pour nulle part sur le système de fichiers Linux. Il s'appelle null
, et il se trouve dans /dev
, il est donc souvent prononcé "devnull" par les personnes qui l'utilisent trop fréquemment pour dire "slash dev slash null".
Vous pouvez envoyer des données à /dev/null
en utilisant la redirection. Par exemple, le find
La commande a tendance à être détaillée et signale souvent des conflits d'autorisation lors de la recherche dans vos fichiers :
$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file
Le find
la commande traite cela comme une erreur, vous pouvez donc rediriger uniquement les messages d'erreur vers /dev/null
:
$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file
Utiliser la redirection
La redirection est un moyen efficace d'obtenir des données d'un endroit à un autre dans Bash. Vous n'utilisez peut-être pas la redirection tout le temps, mais apprendre à l'utiliser lorsque vous en avez besoin peut vous épargner beaucoup d'ouvertures de fichiers inutiles et de copier et coller des données, qui nécessitent généralement des mouvements de souris et de nombreuses pressions sur les touches. Ne recourez pas à de tels extrêmes. Vivez la belle vie et utilisez la redirection.