<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Redirections et tubes</title><meta name="generator" content="DocBook XSL Stylesheets V1.64.0"><link rel="home" href="index.html" title="Manuel de référence"><link rel="up" href="cmdline.html" title="Chapitre 3. Introduction à la ligne de commande"><link rel="previous" href="glob-regex.html" title="Motifs d'englobement du shell"><link rel="next" href="cmdline-completion.html" title="Le complètement (completion) dans les lignes de commande"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Redirections et tubes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="glob-regex.html">Précédent</a> </td><th width="60%" align="center">Chapitre 3. Introduction à la ligne de commande</th><td width="20%" align="right"> <a accesskey="n" href="cmdline-completion.html">Suivant</a></td></tr></table><hr></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="shell-pipes"></a>Redirections et tubes</h2></div></div><div></div></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="id2538479"></a>Encore un mot au sujet des processus</h3></div></div><div></div></div><p><a name="BId-cmdline-pa82"></a>Pour comprendre le principe des redirections et des tubes, ils nous faudra introduire ici une nouvelle notion qui concerne les processus. Chaque processus sous <span class="application">UNIX</span> (y compris les applications graphiques) utilise un minimum de trois descripteurs de fichiers : l'entrée standard, la sortie standard et le canal d'erreur standard. <a class="indexterm" name="BId-cmdline-it38"></a> <a class="indexterm" name="BId-cmdline-it39"></a> <a class="indexterm" name="BId-cmdline-it40"></a> Leurs numéros respectifs sont 0, 1 et 2. En général, ces trois descripteurs sont associés au <tt class="systemitem">Terminal</tt> depuis lequel le processus a été lancé, l'entrée standard étant lue depuis le clavier. Le but des redirections et des tubes est de rediriger ces descripteurs. Les exemples de cette section vous aideront à mieux comprendre.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="id2538584"></a>Redirections</h3></div></div><div></div></div><p><a name="BId-cmdline-pa83"></a> Supposons, par exemple, que vous vouliez connaître la liste des fichiers se terminant par <tt class="filename">.png</tt> <sup>[<a name="id2538609" href="#ftn.id2538609">7</a>]</sup> dans le répertoire <tt class="filename">images</tt>, et que cette liste soit très longue : il serait donc pertinent de la stocker dans un fichier pour la consulter à loisir ensuite. Vous pouvez alors taper ceci : </p><a name="BId-cmdline-sc12"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ ls images/*.png 1>liste_fichiers</pre></td></tr></table><p><a name="BId-cmdline-pa85"></a> <a class="indexterm" name="BId-cmdline-it41"></a>Ce qui signifie que la sortie standard de cette commande (<tt class="literal">1</tt>) est redirigée (<tt class="literal">></tt>) vers le fichier qui a pour nom <tt class="filename">liste_fichiers</tt>. Le signe <tt class="literal">></tt> est l'opérateur de redirection de sortie. Dans le cas où le fichier de redirection n'existerait pas, il serait alors créé. Par contre, s'il existait précédemment, son ancien contenu serait écrasé. Cependant, par défaut, le descripteur redirigé par cet opérateur est la sortie standard, il n'est donc pas nécessaire de le spécifier sur la ligne de commande. Vous pouvez donc écrire plus simplement : </p><a name="BId-cmdline-sc13"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ ls images/*.png >liste_fichiers</pre></td></tr></table><p><a name="BId-cmdline-pa86"></a> <a class="indexterm" name="BId-cmdline-it42"></a> et le résultat serait exactement le même. Vous pouvez ensuite consulter le fichier à l'aide d'un visualiseur de fichiers texte tel que <span><b class="command">less</b></span>. </p><p><a name="BId-cmdline-pa87"></a> <a class="indexterm" name="BId-cmdline-it43"></a> Supposons maintenant que vous vouliez connaître le nombre exact de ces fichiers. Au lieu de compter manuellement, vous pouvez utiliser le bien nommé <span><b class="command">wc</b></span> (<span class="foreignphrase"><i class="foreignphrase">Word Count</i></span>, soit comptage des mots) avec l'option <tt class="option">-l</tt>, qui écrit sur la sortie standard le nombre de lignes du fichier. Pour obtenir le résultat désiré, une solution possible serait la suivante : </p><a name="BId-cmdline-sc14"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">wc -l 0<liste_fichiers</pre></td></tr></table><p><a name="BId-cmdline-pa88"></a> Le signe <tt class="literal"><</tt> est l'opérateur de redirection d'entrée. Le descripteur redirigé par défaut est également celui de l'entrée standard, donc <tt class="literal">0</tt>. La ligne s'écrit alors simplement : </p><a name="BId-cmdline-sc15"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">wc -l <liste_fichiers</pre></td></tr></table><p><a name="BId-cmdline-pa89"></a> <a class="indexterm" name="BId-cmdline-it44"></a> Supposons maintenant que vous vouliez retirer de cette liste toutes les extensions des fichiers puis sauvegarder le résultat dans un autre fichier. L'outil dont vous avez besoin est <span><b class="command">sed</b></span>, pour <span class="foreignphrase"><i class="foreignphrase">Stream EDitor</i></span> (soit éditeur de flux). Il suffit de rediriger l'entrée standard de <span><b class="command">sed</b></span> vers le fichier <tt class="filename">liste_fichiers</tt> et de rediriger sa sortie vers le fichier résultat, par exemple <tt class="filename">la_liste</tt> : </p><a name="BId-cmdline-sc16"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">sed -e 's/\.png$//g' <liste_fichiers >la_liste</pre></td></tr></table><p><a name="BId-cmdline-pa90"></a> Il vous sera également possible de consulter à loisir cette nouvelle liste avec un visualiseur. </p><p><a name="BId-cmdline-pa91"></a> Il pourrait aussi s'avérer utile de rediriger l'erreur standard. Par exemple, vous voulez savoir quels répertoires dans <tt class="filename">/shared</tt> ne vous sont pas accessibles : une solution est de lister récursivement ce répertoire et de rediriger les erreurs vers un fichier, tout en n'affichant pas le canal de sortie standard : </p><a name="BId-cmdline-sc17"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">ls -R /shared >/dev/null 2>erreurs</pre></td></tr></table><p><a name="BId-cmdline-pa92"></a> Ceci signifie que la sortie standard sera redirigée (<tt class="literal">></tt>) vers <tt class="filename">/dev/null</tt>, un fichier spécial dans lequel tout ce qu'on écrit est perdu (et aura comme effet secondaire que la sortie standard ne sera pas affichée) et que le canal d'erreur standard (<tt class="literal">2</tt>) sera redirigé (<tt class="literal">></tt>) vers le fichier <tt class="filename">erreurs</tt>. </p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="id2539054"></a>Tubes</h3></div></div><div></div></div><p><a name="BId-cmdline-pa93"></a> <a class="indexterm" name="BId-cmdline-it45"></a> Les tubes (<span class="foreignphrase"><i class="foreignphrase">pipes</i></span> en anglais) sont en quelque sorte une combinaison des redirections d'entrée et de sortie. Leur principe mime en effet celui d'un tube : un processus envoie des données dans le tube par un bout et un autre processus lit les données par l'autre bout. L'opérateur tube est <tt class="literal">|</tt>. Reprenons l'exemple de la liste des fichiers <tt class="filename">.png</tt> ci-dessus. Supposons que vous vouliez seulement connaître le nombre de fichiers en question sans avoir à stocker la liste dans un fichier temporaire : utilisez alors la commande suivante : </p><a name="BId-cmdline-sc18"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">ls images/*.png | wc -l</pre></td></tr></table><p><a name="BId-cmdline-pa94"></a> ce qui signifie que la sortie standard de la commande <span><b class="command">ls</b></span> (donc la liste des fichiers) est redirigée vers l'entrée standard de la commande <span><b class="command">wc</b></span>. Vous obtenez donc le résultat désiré. </p><p><a name="BId-cmdline-pa95"></a> Vous pouvez de même construire directement la liste des fichiers « <span class="quote">sans les extensions</span> » avec la commande suivante : </p><a name="BId-cmdline-sc19"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">ls images/*.png | sed -e 's/\.png//g' >la_liste</pre></td></tr></table><p><a name="BId-cmdline-pa96"></a> ou, si vous voulez simplement consulter la liste sans la stocker dans un fichier :</p><a name="BId-cmdline-sc20"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">ls images/*.png | sed -e 's/\.png//g' | less</pre></td></tr></table><p><a name="BId-cmdline-pa97"></a> <a class="indexterm" name="BId-cmdline-it46"></a> Les tubes et les redirections ne sont pas limités à du texte. Ainsi en est-il de la commande suivante, lancée à partir d'un <tt class="systemitem">Terminal</tt> : </p><a name="BId-cmdline-sc21"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">xwd -root | convert - ~/mon_bureau.png</pre></td></tr></table><p><a name="BId-cmdline-pa98"></a> <a class="indexterm" name="BId-cmdline-it47"></a>ce qui effectuera une capture d'écran de votre bureau dans le fichier intitulé <tt class="filename">mon_bureau.png</tt> <sup>[<a name="id2539276" href="#ftn.id2539276">8</a>]</sup> dans votre répertoire personnel. </p></div><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id2538609" href="#id2538609">7</a>] </sup>Il peut vous paraître saugrenu de dire « <span class="quote">les fichiers se terminant par <tt class="filename">.png</tt> </span> » plutôt que « <span class="quote">les images <span class="acronym">PNG</span></span> ». Mais, encore une fois, les fichiers sous <span class="application">UNIX</span> n'ont d'extension que par convention : une extension ne détermine en aucun cas le type d'un fichier. Un fichier dont le nom se termine par <tt class="filename">.png</tt> peut indifféremment être une image <span class="acronym">JPEG</span>, un exécutable, un fichier texte ou tout autre chose. Il en est de même sous <span class="application">Windows</span> ! </p></div><div class="footnote"><p><sup>[<a name="ftn.id2539276" href="#id2539276">8</a>] </sup>Oui, ce sera bien une image <span class="acronym">PNG</span> ! (Le paquetage <tt class="filename">ImageMagick</tt> devra néanmoins être installé...) </p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="glob-regex.html">Précédent</a> </td><td width="20%" align="center"><a accesskey="u" href="cmdline.html">Niveau supérieur</a></td><td width="40%" align="right"> <a accesskey="n" href="cmdline-completion.html">Suivant</a></td></tr><tr><td width="40%" align="left" valign="top">Motifs d'englobement du shell </td><td width="20%" align="center"><a accesskey="h" href="index.html">Sommaire</a></td><td width="40%" align="right" valign="top"> Le complètement (completion) dans les lignes de commande</td></tr></table></div></body></html>