====== 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. ===== Les deux flux de sortie ===== 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. ===== Rediriger les erreurs dans un fichier à part ===== 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. ==== Fusionner les sorties ==== 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. ==== Résumé ==== **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. ==== Gestion des erreurs ==== 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