﻿﻿{"id":2405,"date":"2026-02-27T09:53:32","date_gmt":"2026-02-27T08:53:32","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/shells-unix-5-redirections-que-vous-copiez-sans-comprendre\/"},"modified":"2026-02-27T09:53:32","modified_gmt":"2026-02-27T08:53:32","slug":"shells-unix-5-redirections-que-vous-copiez-sans-comprendre","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/shells-unix-5-redirections-que-vous-copiez-sans-comprendre\/","title":{"rendered":"Shells Unix &#8211; 5 redirections que vous copiez sans comprendre"},"content":{"rendered":"<p><code>2&gt;&amp;1<\/code>, <code>&gt;<\/code>, <code>&gt;&gt;<\/code>, <code>2&gt;\/dev\/null<\/code>&#8230; Si ces symboles dans votre terminal Linux ou macOS vous font autant flipper qu&#8217;un regex, respirez un grand coup ! Quand vous aurez lu cet article, vous verrez qu&#8217;en fait c&#8217;est super simple \u00e0 comprendre, et en 5 minutes vous saurez enfin ce que vous copiez-collez depuis des ann\u00e9es depuis StackOverflow.<\/p>\n<p>En fait, dans les shells Unix (bash, zsh, etc.), y&#8217;a 3 canaux de base : <strong>stdin<\/strong> (entr\u00e9e, num\u00e9ro 0), <strong>stdout<\/strong> (sortie normale, num\u00e9ro 1) et <strong>stderr<\/strong> (les erreurs, num\u00e9ro 2). Tout le reste, de <code>&gt;<\/code> \u00e0 <code>2&gt;\/dev\/null<\/code>, d\u00e9coule de ces 3 num\u00e9ros.<\/p>\n<h2><code>&gt;<\/code> &#8211; \u00c9crire dans un fichier (et tout \u00e9craser)<\/h2>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">echo \"Salut\" &gt; fichier.txt\n<\/span><\/span><\/code><\/pre>\n<p>\u00c7a redirige stdout vers <code>fichier.txt<\/code>. Si le fichier existe d\u00e9j\u00e0&#8230; c&#8217;est mort, il est \u00e9cras\u00e9 sans sommation. Du coup, faites gaffe avec vos logs, une commande mal plac\u00e9e et ce sont des heures de donn\u00e9es qui disparaissent.<\/p>\n<p>D&#8217;ailleurs, si vous \u00eates du genre parano (et oui, vous avez raison !), <code>set -o noclobber<\/code> dans votre <code>.bashrc<\/code> emp\u00eachera <code>&gt;<\/code> d&#8217;\u00e9craser un fichier existant lors d&#8217;une commande tap\u00e9e \u00e0 la main. Pour y arriver, il faudra utiliser <code>&gt;|<\/code> pour forcer.<\/p>\n<h2><code>&gt;&gt;<\/code> &#8211; Ajouter \u00e0 la suite<\/h2>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">echo \"Ligne 2\" &gt;&gt; fichier.txt\n<\/span><\/span><\/code><\/pre>\n<p>M\u00eame principe que <code>&gt;<\/code>, sauf que \u00e7a ajoute \u00e0 la fin au lieu d&#8217;\u00e9craser. C&#8217;est ce que vous voulez 99% du temps pour des logs (sauf si vous voulez repartir de z\u00e9ro, l\u00e0 <code>&gt;<\/code> fait le job). Une lettre de diff\u00e9rence entre &#8220;<em>tout va bien<\/em>&#8221; et &#8220;<em>o\u00f9 sont pass\u00e9s mes logs, boudiouuu ???<\/em>&#8220;.<\/p>\n<h2><code>2&gt;<\/code> &#8211; Rediriger les erreurs<\/h2>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">commande_foireuse 2&gt; erreurs.log\n<\/span><\/span><\/code><\/pre>\n<p>Le <code>2<\/code> c&#8217;est stderr, en gros (y&#8217;a pas d&#8217;espace entre le 2 et le <code>&gt;<\/code>, sinon bash croit que 2 est un argument). Tout ce qui sort en erreur finit dans <code>erreurs.log<\/code> au lieu de polluer votre terminal. Perso, je trouve \u00e7a super pratique pour garder une trace propre quand vous lancez des scripts via <code>crontab -e<\/code>.<\/p>\n<p>Et <code>2&gt;&gt;<\/code> existe aussi, pour cumuler les erreurs au fil du temps au lieu d&#8217;\u00e9craser le fichier \u00e0 chaque ex\u00e9cution.<\/p>\n<h2><code>2&gt;&amp;1<\/code> &#8211; Fusionner erreurs et sortie normale<\/h2>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">commande &gt; output.log 2&gt;&amp;1\n<\/span><\/span><\/code><\/pre>\n<p>Le fameux ! Le <code>&amp;1<\/code> dit \u00e0 bash &#8220;<em>le 1 c&#8217;est un file descriptor, pas un fichier qui s&#8217;appelle litt\u00e9ralement 1<\/em>&#8220;. Du coup stderr (2) est redirig\u00e9 vers le m\u00eame endroit que stdout (1), ou plut\u00f4t vers l\u00e0 o\u00f9 stdout pointe au moment o\u00f9 bash \u00e9value la ligne. \u00c7a va, vous suivez toujours ? ^^<\/p>\n<p>Attention, l&#8217;ordre compte ! Bash lit les redirections de gauche \u00e0 droite. <code>&gt; output.log 2&gt;&amp;1<\/code>, stdout pointe vers le fichier, puis stderr suit&#8230; tout va dans le fichier. <code>2&gt;&amp;1 &gt; output.log<\/code>, stderr copie stdout qui pointe ENCORE vers le terminal, puis stdout est redirig\u00e9 vers le fichier. R\u00e9sultat, les erreurs restent dans votre terminal. Le pi\u00e8ge classique.<\/p>\n<p>Et <code>&amp;&gt;<\/code> fait la m\u00eame chose en plus court :<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">commande &amp;&gt; output.log\n<\/span><\/span><\/code><\/pre>\n<p><code>&amp;&gt;<\/code> est super pratique, mais sp\u00e9cifique \u00e0 bash \/ zsh donc pour la portabilit\u00e9, pr\u00e9f\u00e9rez quand m\u00eame <code>&gt; fichier 2&gt;&amp;1<\/code>.<\/p>\n<h2><code>2&gt;\/dev\/null<\/code> &#8211; Le trou noir<\/h2>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">find \/ -name \"*.conf\" 2&gt;\/dev\/null\n<\/span><\/span><\/code><\/pre>\n<p><code>\/dev\/null<\/code>, c&#8217;est le trou noir d&#8217;Unix. Tout ce que vous envoyez l\u00e0-dedans dispara\u00eet. Super pratique avec <code>find<\/code> qui vous crache 200 &#8220;Permission denied&#8221; pour un seul r\u00e9sultat utile.<\/p>\n<p>Et si vous voulez TOUT faire dispara\u00eetre (stdout + stderr) ? Un petit <code>&amp;&gt;\/dev\/null<\/code> et c&#8217;est r\u00e9gl\u00e9. Pratique dans vos scripts <code>\/etc\/cron.d\/<\/code> quand vous voulez z\u00e9ro bruit (bon, j&#8217;exag\u00e8re un chou\u00efa, je sais&#8230;).<\/p>\n<p>Si vous aimez les<br \/>\n<a href=\"https:\/\/korben.info\/les-raccourcis-clavier-pour-bash-terminal-linux-et-macos.html\">raccourcis bash<\/a><br \/>\n, j&#8217;ai aussi ce qu&#8217;il faut.<\/p>\n<p>Bref, voil\u00e0 ce sont juste 5 op\u00e9rateurs \u00e0 retenir, et avec \u00e7a vous couvrez \u00e0 peu pr\u00e8s tout. Donc la prochaine fois que vous copierez un <code>2&gt;&amp;1<\/code>, au moins vous saurez pourquoi.<\/p>\n<p>\n<a href=\"https:\/\/stackoverflow.com\/questions\/818255\/what-does-21-mean\">Source d&#8217;inspiration<\/a>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>2&gt;&amp;1, &gt;, &gt;&gt;, 2&gt;\/dev\/null&#8230; Si ces symboles dans votre terminal Linux ou macOS vous font autant flipper qu&#8217;un regex, respirez un grand coup ! Quand vous aurez lu cet article, vous verrez qu&#8217;en fait c&#8217;est super simple \u00e0 comprendre, et en 5 minutes vous saurez enfin ce que vous copiez-collez depuis des ann\u00e9es depuis StackOverflow. En fait, dans les shells Unix (bash, zsh, etc.), y&#8217;a 3 canaux de base : stdin (entr\u00e9e, num\u00e9ro 0), stdout (sortie normale, num\u00e9ro 1) et stderr (les erreurs, num\u00e9ro 2). Tout le reste, de &gt; \u00e0 2&gt;\/dev\/null, d\u00e9coule de ces 3 num\u00e9ros. &gt; &#8211; \u00c9crire dans un fichier (et tout \u00e9craser) echo &#8220;Salut&#8221; &gt; fichier.txt \u00c7a redirige stdout vers fichier.txt. Si le fichier existe d\u00e9j\u00e0&#8230; c&#8217;est mort, il est \u00e9cras\u00e9 sans sommation. Du coup, faites gaffe avec vos logs, une commande mal plac\u00e9e et ce sont des heures de donn\u00e9es qui disparaissent. D&#8217;ailleurs, si vous \u00eates du genre parano (et oui, vous avez raison !), set -o noclobber dans votre .bashrc emp\u00eachera &gt; d&#8217;\u00e9craser un fichier existant lors d&#8217;une commande tap\u00e9e \u00e0 la main. Pour y arriver, il faudra utiliser &gt;| pour forcer. &gt;&gt; &#8211; Ajouter \u00e0 la suite echo &#8220;Ligne 2&#8243; &gt;&gt; fichier.txt M\u00eame principe que &gt;, sauf que \u00e7a ajoute \u00e0 la fin au lieu d&#8217;\u00e9craser. C&#8217;est ce que vous voulez 99% du temps pour des logs (sauf si vous voulez repartir de z\u00e9ro, l\u00e0 &gt; fait le job). Une lettre de diff\u00e9rence entre &#8220;tout va bien&#8221; et &#8220;o\u00f9 sont pass\u00e9s mes logs, boudiouuu ???&#8220;. 2&gt; &#8211; Rediriger les erreurs commande_foireuse 2&gt; erreurs.log Le 2 c&#8217;est stderr, en gros (y&#8217;a pas d&#8217;espace entre le 2 et le &gt;, sinon bash croit que 2 est un argument). Tout ce qui sort en erreur finit dans erreurs.log au lieu de polluer votre terminal. Perso, je trouve \u00e7a super pratique pour garder une trace propre quand vous lancez des scripts via crontab -e. Et 2&gt;&gt; existe aussi, pour cumuler les erreurs au fil du temps au lieu d&#8217;\u00e9craser le fichier \u00e0 chaque ex\u00e9cution. 2&gt;&amp;1 &#8211; Fusionner erreurs et sortie normale commande &gt; output.log 2&gt;&amp;1 Le fameux ! Le &amp;1 dit \u00e0 bash &#8220;le 1 c&#8217;est un file descriptor, pas un fichier qui s&#8217;appelle litt\u00e9ralement 1&#8220;. Du coup stderr (2) est redirig\u00e9 vers le m\u00eame endroit que stdout (1), ou plut\u00f4t vers l\u00e0 o\u00f9 stdout pointe au moment o\u00f9 bash \u00e9value la ligne. \u00c7a va, vous suivez toujours ? ^^ Attention, l&#8217;ordre compte ! Bash lit les redirections de gauche \u00e0 droite. &gt; output.log 2&gt;&amp;1, stdout pointe vers le fichier, puis stderr suit&#8230; tout va dans le fichier. 2&gt;&amp;1 &gt; output.log, stderr copie stdout qui pointe ENCORE vers le terminal, puis stdout est redirig\u00e9 vers le fichier. R\u00e9sultat, les erreurs restent dans votre terminal. Le pi\u00e8ge classique. Et &amp;&gt; fait la m\u00eame chose en plus court : commande &amp;&gt; output.log &amp;&gt; est super pratique, mais sp\u00e9cifique \u00e0 bash \/ zsh donc pour la portabilit\u00e9, pr\u00e9f\u00e9rez quand m\u00eame &gt; fichier 2&gt;&amp;1. 2&gt;\/dev\/null &#8211; Le trou noir find \/ -name &#8220;*.conf&#8221; 2&gt;\/dev\/null \/dev\/null, c&#8217;est le trou noir d&#8217;Unix. Tout ce que vous envoyez l\u00e0-dedans dispara\u00eet. Super pratique avec find qui vous crache 200 &#8220;Permission denied&#8221; pour un seul r\u00e9sultat utile. Et si vous voulez TOUT faire dispara\u00eetre (stdout + stderr) ? Un petit &amp;&gt;\/dev\/null et c&#8217;est r\u00e9gl\u00e9. Pratique dans vos scripts \/etc\/cron.d\/ quand vous voulez z\u00e9ro bruit (bon, j&#8217;exag\u00e8re un chou\u00efa, je sais&#8230;). Si vous aimez les raccourcis bash , j&#8217;ai aussi ce qu&#8217;il faut. Bref, voil\u00e0 ce sont juste 5 op\u00e9rateurs \u00e0 retenir, et avec \u00e7a vous couvrez \u00e0 peu pr\u00e8s tout. Donc la prochaine fois que vous copierez un 2&gt;&amp;1, au moins vous saurez pourquoi. Source d&#8217;inspiration<\/p>\n","protected":false},"author":1,"featured_media":2406,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2405","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2405"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2405\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2406"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}