scripts:echapement

BEST redirect

  2>, 2>> et 2>&1 : rediriger les erreurs  
         

Allons un peu plus loin. Il faut savoir que toutes les commandes produisent deux flux de données différents, comme le montre la figure suivante :

  la sortie standard : pour tous les messages (sauf les erreurs) ;
  la sortie d'erreurs : pour toutes les erreurs.

Supposons que vous fait un cat du fichier notes.csv pour afficher son contenu.

Deux possibilités :

  si tout va bien, le résultat (le contenu du fichier) s'affiche sur la sortie standard ;
  s'il y a une erreur, celle-ci s'affiche dans la sortie d'erreurs.

Par défaut, tout s'affiche dans la console : la sortie standard comme la sortie d'erreurs. Cela explique pourquoi vous ne faisiez pas la différence entre ces deux sorties jusqu'ici : elles avaient l'air identiques.

Tout à l'heure, nous avons vu comment rediriger la sortie standard dans un fichier. Toutefois, les erreurs continuent d'être affichées dans la console. Faites le test :

  cut -d , -f 1 fichier_inexistant.csv > eleves.txt
  cut: fichier_inexistant.csv: Aucun fichier ou répertoire de ce type

Le fichier fichier_inexistant.csv n'existe pas (comme son nom l'indique). L'erreur s'est affichée dans la console au lieu d'avoir été envoyée dans eleves.txt.

On pourrait souhaiter enregistrer les erreurs dans un fichier à part pour ne pas les oublier et pour pouvoir les analyser ensuite.

Pour cela, on utilise l'opérateur 2>. Vous avez bien lu : c'est le chiffre 2 collé au chevron que nous avons utilisé tout à l'heure.

redirection à la fin de commande cut :

   cut -d , -f 1 fichier_inexistant.csv > eleves.txt 2> erreurs.log

Il y a deux redirections ici :

  > eleves.txt : redirige le résultat de la commande (sauf les erreurs) dans le fichier eleves.txt. C'est la sortie standard ;
  2> erreurs.log : redirige les erreurs éventuelles dans le fichier erreurs.log. C'est la sortie d'erreurs.
  

Notez qu'il est aussi possible d'utiliser 2» pour ajouter les erreurs à la fin du fichier.

Parfois, on n'a pas envie de séparer les informations dans deux fichiers différents. Heureusement, il est possible de fusionner les sorties dans un seul et même fichier. Comment ?

Il faut utiliser le code suivant : 2>&1. Cela a pour effet de rediriger toute la sortie d'erreurs dans la sortie standard. Traduction pour l'ordinateur : « envoie les erreurs au même endroit que le reste ».

Essayez ceci :

    cut -d , -f 1 fichier_inexistant.csv > eleves.txt 2>&1

Tout ira désormais dans eleves.txt : le résultat (si cela a fonctionné), de même que les erreurs (s'il y a eu un problème).

Petite subtilité : je vous ai dit tout à l'heure qu'il était possible de faire 2» pour rediriger les erreurs à la fin d'un fichier d'erreurs. Toutefois, il n'est pas possible d'écrire 2»&1. Essayez, ça ne marchera pas.

En fait, le symbole 2>&1 va envoyer les erreurs dans le même fichier et de la même façon que la sortie standard. Donc, si vous écrivez :

   cut -d , -f 1 fichier_inexistant.csv >> eleves.txt 2>&1

… les erreurs seront ajoutées à la fin du fichier eleves.txt comme le reste des messages.

Nous avons découvert trois symboles :

  2> : redirige les erreurs dans un fichier (s'il existe déjà, il sera écrasé) ;
  2>> : redirige les erreurs à la fin d'un fichier (s'il n'existe pas, il sera créé) ;
  2>&1 : redirige les erreurs au même endroit et de la même façon que la sortie standard.

Le tout est illustré sur la figure suivante.

On peut choisir de rediriger les erreurs dans un fichier à part (avec 2>) ou bien de les rediriger au même endroit que la sortie standard (avec 2>&1).

J'ai volontairement omis de parler sur ce schéma de » et de 2» afin de ne pas le surcharger, mais le principe est le même sauf qu'on ajoute à la fin d'un fichier au lieu de l'écraser.

source: https://openclassrooms.com/fr/courses/43538-reprenez-le-controle-a-laide-de-linux

  • scripts/echapement.txt
  • Dernière modification : 2022/11/08 16:43
  • de 127.0.0.1