GNU/Linux >> Tutoriels Linux >  >> Linux

Explication :Redirection des entrées, des sorties et des erreurs sous Linux

Si vous connaissez les commandes Linux de base, vous devriez également apprendre le concept de redirection d'entrée-sortie.

Vous savez déjà comment fonctionne une commande Linux. Il prend une entrée et vous donne une sortie. Il y a quelques joueurs dans la scène ici. Laissez-moi vous en parler.

Stdin, stdout et stderr

Lorsque vous exécutez une commande Linux, trois flux de données y jouent un rôle :

  • L'entrée standard (stdin) est la source des données d'entrée. Par défaut, stdin est n'importe quel texte saisi à partir du clavier. Son ID de flux est 0.
  • La sortie standard (stdout) est le résultat de la commande. Par défaut, il est affiché à l'écran. Son ID de flux est 1.
  • L'erreur standard (stderr) est le message d'erreur (le cas échéant) produit par les commandes. Par défaut, stderr est également affiché à l'écran. Son ID de flux est 2.

Ces flux contiennent les données en texte brut dans ce qu'on appelle la mémoire tampon.

Considérez-le comme un courant d'eau. Il vous faut une source d'eau, un robinet par exemple. On y raccorde un tuyau et on peut soit le ranger dans un seau (dossier), soit arroser les plantes (imprimer). Vous pouvez également le connecter à un autre robinet, si nécessaire. En gros, vous redirigez l'eau.

Linux a également ce concept de redirection, où vous pouvez rediriger le stdin, stdout et stderr de sa destination habituelle vers un autre fichier ou commande (ou même des périphériques comme des imprimantes).

Laissez-moi vous montrer comment fonctionne la redirection et comment vous pouvez l'utiliser.

La redirection de sortie

La première et la plus simple forme de redirection est la redirection de sortie, également appelée redirection stdout.

Vous savez déjà que par défaut, la sortie d'une commande est affichée à l'écran. Par exemple, j'utilise la commande ls pour lister tous les fichiers et voici le résultat que j'obtiens :

[email protected]:~$ ls
appstxt  new.txt  static-ip.txt

Avec la redirection de sortie, vous pouvez rediriger la sortie vers un fichier. Si ce fichier de sortie n'existe pas, le shell le créera.

command > file

Par exemple, permettez-moi d'enregistrer la sortie de la commande ls dans un fichier nommé output.txt :

[email protected]:~$ ls > output.txt

Le fichier de sortie est créé au préalable

Que pensez-vous que le contenu de ce fichier de sortie devrait être ? Laissez-moi utiliser la commande cat pour vous montrer une surprise :

[email protected]:~$ cat output.txt 
appstxt
new.txt
output.txt
static-ip.txt

Avez-vous remarqué que l'inclusion de output.txt ici ? J'ai délibérément choisi cet exemple pour vous le montrer.

Le fichier de sortie vers lequel la sortie standard est redirigée est créé avant l'exécution de la commande prévue. Pourquoi? Parce qu'il doit avoir la destination de sortie prête à laquelle la sortie sera envoyée.

Ajouter au lieu de clobber

Un problème souvent ignoré est que si vous redirigez vers un fichier qui existe déjà, le shell effacera (clobber) le fichier en premier. Cela signifie que le contenu existant du fichier de sortie sera supprimé et remplacé par la sortie de la commande.

Vous pouvez ajouter, au lieu de l'écraser, en utilisant la>> syntaxe de redirection.

command >> file

Astuce :Vous pouvez interdire le clobbering dans la session shell en cours en utilisant :set -C

Pourquoi redirigeriez-vous stdout ? Vous pouvez stocker la sortie pour référence future et l'analyser ultérieurement. C'est particulièrement utile lorsque la sortie de la commande est trop grande et qu'elle occupe tout votre écran. C'est comme collecter des journaux.

Redirection de canal

Avant de voir la redirection stdin, vous devez en savoir plus sur la redirection de canal. C'est plus courant et vous l'utiliserez probablement beaucoup.

Avec la redirection de canal, vous envoyez la sortie standard d'une commande à l'entrée standard d'une autre commande.

command 1 | command 2

Laissez-moi vous montrer un exemple pratique. Supposons que vous souhaitiez compter le nombre de fichiers visibles dans le répertoire actuel. Vous pouvez utiliser ls -1 (c'est le chiffre un, pas la lettre L) pour afficher les fichiers du répertoire courant :

[email protected]:~$ ls -1
appstxt
new.txt
output.txt
static-ip.txt

Vous savez probablement déjà que la commande wc est utilisée pour compter le nombre de lignes dans un fichier. Si vous combinez ces deux commandes avec pipe, voici ce que vous obtenez :

[email protected]:~$ ls -1 | wc -l
4

Avec pipe, les deux commandes partagent la même mémoire tampon. La sortie de la première commande est stockée dans le tampon et le même tampon est ensuite utilisé comme entrée pour la commande suivante.

Vous verrez le résultat de la dernière commande dans le pipeline. C'est évident car la sortie standard de la ou des commandes précédentes est transmise à la ou aux commandes suivantes au lieu d'aller à l'écran.

La redirection de tuyau ou la tuyauterie ne se limite pas à connecter seulement deux commandes. Vous pouvez connecter plus de commandes tant que la sortie d'une commande peut être utilisée comme entrée de la commande suivante.

command_1 | command_2 | command_3 | command_4

N'oubliez pas que stdout/stdin est un bloc de données, pas des noms de fichiers

Certains nouveaux utilisateurs de Linux sont confus lors de l'utilisation de la redirection. Si une commande renvoie un ensemble de noms de fichiers en sortie, vous ne pouvez pas utiliser ces noms de fichiers comme argument.

Par exemple, si vous utilisez la commande find pour trouver tous les fichiers se terminant par .txt, vous ne pouvez pas la passer par pipe pour déplacer les fichiers trouvés vers un nouveau répertoire, pas directement comme ceci :

find . -type f -name "*.txt" | mv destination_directory

C'est pourquoi vous verrez souvent la commande find utilisée en conjugaison avec la commande exec ou xargs. Ces commandes spéciales "convertissent le texte avec un tas de noms de fichiers en nom de fichier" qui peuvent être passés en argument.

find . -type f -name "*.txt" | xargs -t -I{} mv {} ../new_dir

La redirection d'entrée

Vous pouvez utiliser la redirection stdin pour transmettre le contenu d'un fichier texte à une commande comme celle-ci :

command < file

Vous ne verrez pas stdin être beaucoup utilisé. C'est parce que la plupart des commandes Linux acceptent les noms de fichiers comme argument et donc la redirection stdin n'est souvent pas nécessaire.

Prenez ceci par exemple :

head < filename.txt

La commande ci-dessus aurait pu être simplement head filename.txt (sans le <).

Ce n'est pas que la redirection stdin soit complètement inutile. Certaines commandes en dépendent. Prenez la commande tr par exemple. Cette commande peut faire beaucoup mais dans l'exemple ci-dessous, elle convertit le texte saisi de minuscules en majuscules :

tr a-z A-Z < filename.txt

En fait, l'utilisation de stdin est conseillée sur pipe spécialement pour éviter l'utilisation inutile de la commande cat.

Par exemple, beaucoup de gens utiliseraient l'exemple ci-dessus avec cat puis utiliseraient tr dessus. Franchement, il n'est pas nécessaire d'utiliser un chat ici.

cat filename.txt | tr a-z A-Z

Combiner les redirections

Vous pouvez combiner la redirection stdin, stdout et pipe selon vos besoins.

Par exemple, la commande ci-dessous répertorie tous les fichiers .txt du répertoire actuel, puis compte ces fichiers .txt et enregistre la sortie dans un nouveau fichier.

ls *.txt | wc -l > count.txt

Erreur de redirection

Parfois, lorsque vous exécutez une commande ou un script, vous verrez qu'il affiche un message d'erreur à l'écran.

[email protected]:~$ ls -l ffffff > output.txt
ls: cannot access 'ffffff': No such file or directory

Au début de cet article, j'ai mentionné qu'il existe trois flux de données et que stderr est l'un des flux de données de sortie qui s'affiche par défaut à l'écran.

Vous pouvez également rediriger le stderr. Puisqu'il s'agit d'un flux de données de sortie, vous pouvez utiliser le même symbole de redirection> ou>> que vous avez utilisé pour la redirection stdout.

Mais comment faites-vous la distinction entre stdout et stderr lorsqu'ils sont tous deux des flux de données de sortie ? Par leur ID de flux (également appelé descripteur de fichier).

Flux de données ID de flux
stdin 0
stdout 1
stderr 2
-t, –liste
-u, –mise à jour
-x, –extraire, –obtenir
-j, –bzip2
-z, –gzip, –gunzip, –ungzip

Par défaut, lorsque vous utilisez le symbole de redirection de sortie>, cela signifie en fait 1>. En d'autres termes, vous dites que le flux de données avec l'ID 1 est généré ici.

Lorsque vous devez rediriger le stderr, vous utilisez son ID comme 2> ou 2>>. Cela signifie que la redirection de sortie est pour le flux de données stderr (ID 2).

Exemples de redirection Stderr

Laissez-moi vous le montrer avec quelques exemples. Supposons que vous souhaitiez simplement enregistrer l'erreur, vous pouvez utiliser quelque chose comme ceci :

[email protected]:~$ ls fffff 2> error.txt
[email protected]:~$ cat error.txt 
ls: cannot access 'fffff': No such file or directory

C'était simple. Rendons les choses un peu plus compliquées (et utiles) :

[email protected]:~$ ls -l new.txt ffff > output.txt 2> error.txt 
[email protected]:~$ cat output.txt 
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt
[email protected]:~$ cat error.txt 
ls: cannot access 'ffff': No such file or directory

Dans l'exemple ci-dessus, la commande ls essaie d'afficher deux fichiers. Pour un fichier, il obtient un succès et pour l'autre, il obtient une erreur. Donc ce que j'ai fait ici est de rediriger le stdout vers ouput.txt (avec>) et le stderr vers error.txt (avec 2>).

Vous pouvez également rediriger à la fois stdout et stderr vers le même fichier. Il existe des moyens de le faire.

Dans l'exemple ci-dessous, j'envoie d'abord le stderr (avec 2>>) au fichier combiné.txt en mode ajout. Et ensuite, la sortie standard (avec>>) est envoyée au même fichier en mode ajout.

[email protected]:~$ ls -l new.txt fff 2>> combined.txt >> combined.txt 
[email protected]:~$ cat combined.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

Une autre façon, et c'est la préférée, consiste à utiliser quelque chose comme 2>&1. Ce qui peut être grossièrement traduit par "rediriger stderr vers la même adresse que stdout".

Prenons l'exemple précédent et cette fois, utilisez le 2>&1 pour rediriger à la fois stdout et stderr vers le même fichier.

[email protected]:~$ ls -l new.txt fff > output.txt 2>&1
[email protected]:~$ cat output.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

Gardez à l'esprit que vous ne pouvez pas utiliser 2>>&1 en pensant l'utiliser en mode ajout. 2>&1 passe déjà en mode ajout.

Vous pouvez également utiliser 2> d'abord, puis utiliser 1> &2 pour rediriger stdout vers le même fichier que stderr. Fondamentalement, c'est ">&" qui redirige un flux de données vers un autre.

Résumé

  • Il existe trois flux de données. Une entrée, stdin (0) et deux flux de données de sortie stdout (1) et stderr (2).
  • Le clavier est le périphérique stdin par défaut et l'écran est le périphérique de sortie par défaut.
  • La redirection de sortie est utilisée avec> ou>> (pour le mode ajout).
  • La redirection d'entrée est utilisée avec <.
  • Le stderr peut être redirigé en utilisant 2> ou 2>>.
  • Le stderr et le stdout peuvent être combinés en utilisant 2>&1.

Puisque vous découvrez la redirection, vous devez également connaître la commande tee. Cette commande vous permet d'afficher simultanément sur la sortie standard et d'enregistrer dans un fichier.

J'espère que vous avez aimé ce guide détaillé sur la redirection sous Linux. Si vous avez encore des doutes ou si vous avez des suggestions pour améliorer cet article, n'hésitez pas à me le faire savoir dans la section des commentaires.


Linux
  1. Utilisation de l'entrée-sortie et de la redirection d'erreur sous Linux

  2. Redirection d'entrée/sortie sous Linux/Unix

  3. $_ Vs !$. Dernier argument de la commande précédente et redirection de sortie ?

  4. Commande ls sous Linux :17 exemples utiles expliqués

  5. Pipes et redirection sous Linux - expliqués !

Commande source sur Linux expliquée

Explication de la redirection d'entrée-sortie sur Linux

Commande d'écran sur Linux expliquée

Explication de la commande Arping sur Linux

Shell Scripting Part4 - Entrée, sortie et redirection

Exemples de commandes echo Linux