<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1517"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1517/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1517/atom/feed</id>
  <updated>2008-07-30T14:49:02+02:00</updated>
  <entry>
    <title>Introduction à la ligne de commande</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1517" />
    <id>http://artisan.karma-lab.net/node/1517</id>
    <published>2008-03-22T12:32:02+01:00</published>
    <updated>2008-07-30T14:49:02+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Serveurs" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
S'il y a bien un truc qui fait peur au nouveaux linuxiens, c'est la ligne de commande. Certains la prétendent archaïque mais il s’agit plus d’une crainte liée à une manière "nouvelle" de travailler. En effet, la ligne de commande, comme toutes les interfaces, a ses forces et ses faiblesses. Et chercher à organiser ses fichiers avec est aussi idiot que de systématiquement utiliser une interface graphique pour les décompresser. Ce billet n'est donc pas une ode à la ligne de commande, mais juste une modeste introduction permettant, je l’espère, de prendre conscience de sa puissance pour un certain nombre de tâches spécifiques. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
S'il y a bien un truc qui fait peur au nouveaux linuxiens, c'est la ligne de commande. Certains la prétendent archaïque mais il s’agit plus d’une crainte liée à une manière "nouvelle" de travailler. En effet, la ligne de commande, comme toutes les interfaces, a ses forces et ses faiblesses. Et chercher à organiser ses fichiers avec est aussi idiot que de systématiquement utiliser une interface graphique pour les décompresser. Ce billet n'est donc pas une ode à la ligne de commande, mais juste une modeste introduction permettant, je l’espère, de prendre conscience de sa puissance pour un certain nombre de tâches spécifiques. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Les vues</h2>
	
<p>
  Petite digression pour commencer, le système de "vues" sous Linux. En standard, Linux dispose de 6 vues textes et 6 vues graphiques. Chaque vue est accessible par la combinaison de touche <kbd>CTRL-ALT-F1</kbd> à <kbd>CTRL-ALT-F6</kbd> pour les vues textes et <kbd>CTRL-ALT-F7</kbd> à <kbd>CTRL-ALT-F12</kbd> pour les vues graphiques. Avant de jouer avec ces touches, gardez en tête que vous êtes en ce moment même sur la vue graphique n°1 et que vous pouvez donc revenir ici par <kbd>CTRL-ALT-F7</kbd>. Maintenant allez-y, testez <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>
</p>
<p>
   Vous constatez tout d'abord que les vues 8 à 12 sont vides. La raison en est que le serveur graphique (X) ne les utilise pas toute, tout de suite. Chaque vue correspond à un utilisateur connecté. Pour le tester cela, sous Gnome, allez dans <kbd>Système/Fermer Session.../Changer d'utilisateur</kbd>. N'ayez pas peur, vous n'allez rien "fermer" en réalité et vous arrivez juste sur une fenêtre de connexion. Si vous entrez à nouveau votre login/mot de passe, une nouvelle session est ouverte. Et cette fois, elle est sur la deuxième vue graphique. Faites le test vous-même et passez de l'une à l'autre par <kbd>CTRL-ALT-F7</kbd> et <kbd>CTRL-ALT-F8</kbd>. Sous Unix en général, et sous Linux en particulier, vous pouvez ainsi avoir autant de session graphique que vous le désirez, une pour chaque utilisateur de votre choix. Pas besoin de version "pro" comme sous Windows <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> Et surtout cela prend très peu de ressources. 
</p>
<p>
  Maintenant intéressons nous à notre sujet de départ et allons sur <kbd>CTRL-ALT-F1</kbd>. Là il s'agit de la première vue texte qui donne lieu à la saisie d'un login/mot de passe. Comme pour la vue graphique, vous pouvez passer d'une session texte à l'autre et vous connecter ainsi plusieurs fois. 
</p>
<p>
  Et bien ces sessions texte, ce sont des <kbd>consoles</kbd> permettant de saisir, une fois connecté, des <kbd>commandes</kbd>. Elles sont très pratiques car toujours accessibles, même quant la partie graphique n'est pas lancée ou est surchargée. Elles permettent dans le second cas de tuer un processus bloqueur.
</p>

	<a name='chapter_2'></a>
  <h2>Les consoles</h2>
	
<p>
   Ceci dit, il n'est pas très pratique de basculer en mode texte à chaque commande à saisir. On réserve cela à des situations de crise ou au démarrage de la machine. Lorsque l'on est au chaud dans sa session graphique, on utilise plutôt un émulateur de console. Si vous allez dans le menu de vos applications vous en avez forcement une dans vos <kbd>outils</kbd>. Il s'agit de <kbd>konsole</kbd> sous KDE, <kbd>gnome-terminal</kbd> sous Gnome, mais il y en a des tripotées de disponibles à installer (mrxvt, xterm, xfce-term, etc...). 
</p>
<p>
  Mais au fond toutes permettent la même chose, taper des commandes. Au lancement, elle affichent toute un écran qui simule un affichage texte et affichent une <kbd>invite</kbd>. L'invite est un ligne de texte indiquant généralement le dossier dans le quel on se trouve, votre nom d'utilisateur et se termine par le symbole <kbd>$</kbd> indiquant que l'on a pas les droits <kbd>root</kbd> (sinon, ce serait un symbole dièse)
</p>
<p>
  Ce dernier point (root ou pas root) pose souvent des problèmes aux évadés de Redmont. Donc nouvelle petite digression.
</p>

	<a name='chapter_3'></a>
  <h2>Les droits</h2>
	
<p>
   La véritable raison qui fait que les virus prolifèrent sous Windows tient à la manière de gérer les droits. Un système sain va distinguer deux ensembles : les utilisateurs et l'administrateur de la machine. Les utilisateurs n'ont pas de droits hors de leur dossiers, ne peuvent installer d'application, ne peuvent installer de pilotes, ne peuvent pas ouvrir de serveur sur un port TCP/IP protégé, etc. L'administrateur, lui, a le droit de faire tout cela. Ainsi, dans un système sain, un utilisateur ne peut pas rendre le système instable en faisant une grosse bêtise (genre virer un fichier vitale). Et il en va de même pour un virus attrapé par un utilisateur, car ce dernier aura les mêmes droits réduits. 
</p>
<p>
   Maintenant cette vision utilisateur/administrateur est tout a fait compréhensible en entreprise, mais l'est beaucoup moins pour un ordinateur personnel où l'utilisateur est généralement son propre administrateur. Et c'est là que la logique diffère entre Windows et Unix. Car à ce stade Windows est <b>aussi sain</b> que Linux. Sous Windows vous avez la même séparation des droits. La seule différence est que sous Unix existe de nombreux mécanisme permettant à un utilisateur d'acquérir simplement les droits administrateur (root) pendant un temps donné. Sous Windows, c'est beaucoup plus compliqué. En conséquence, nombre d'utilisateur Windows, très logiquement agacés lorsqu'ils sont bloqués par la moindre installation de logiciel, vont dans leur profile et se déclare "administrateur" de la machine. Et là les ennuis commencent, ils peuvent déstabiliser le système et surtout les virus ont, eu aussi, les droits administrateur et peuvent faire de vrais dégâts. 
</p>
<p>
  Et Vista n'a rien arrangé au problème. Ils ont augmenté la séparation utilisateur/administrateur rendant le système tellement contraignant que je n'ai jamais vu un seul utilisateur de Vista qui n’a pas désactivé purement et simplement la sécurité....
</p>
<p>
  Sous Linux, il existe de nombreux moyens de prendre pour un temps les droits administrateur. Sous Gnome par exemple, dés qu'une application graphique a besoin de ses droits spéciaux, elle va systématiquement demander le mot de passe de l'administrateur. Il en va de même sous KDE. Et en ligne de commande, nous allons le voir, c'est très facile aussi. En conclusion, la règle absolu est de ne <b>jamais se connecter en session graphique en tant que root</b>, et de <b>toujours laisser les mots de passe activés</b>. 
</p>
<p>
  Lorsque vous êtes en console, le moyen préconisé pour exécuter une commande qui demande les droits root, <b>n'est pas de se connecter en root via un su -</b>. Le meilleur moyen est d'utiliser la commande <kbd>sudo</kbd>. Cette dernière va vous donner les droits root pendant un court temps, ou pour juste une commande en ne vous demandant que votre mot de passe utilisateur. Cette commande est configurée par défaut dans la majorité des distribution, sinon, cherchez de l'aide sur <kbd>visudo</kbd>. Par exemple pour installer une application en ligne de commande :

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>sudo urpmi openoffice</div><div class='result'>mot de passe: votre mot de passe utilisateur</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  <div class='caption'>exemple d&#039;utilisation de sudo pour installer</div>
  </div>
</p>

	<a name='chapter_4'></a>
  <h2>L’interpréteur de ligne de commande</h2>
	
<p>
  Tout à l’heure je vous disais qu’une console affichait une <kbd>invite</kbd>. En réalité ce n’est pas tout à fait vrai. Une console ne fait que simuler un écran texte et lance, par défaut un utilitaire appelé « interpréteur de ligne de commande ». Souvent cet interpréteur est <kbd>bash</kbd>, mais il y en a d’autre chacun avec leur syntaxe. Pour ce qui suit, nous allons parler de bash. 
</p>
<p>
  Le rôle de l’interpréteur de commande est, comme son nom l’indique, le lire ce que vous tapez et lorsque vous validez, d’en interpréter le contenu et de lancer les commandes correspondant à la syntaxe que vous avez saisi. 
</p>
<p>
   Ainsi toute la logique que nous allons maintenant voir est en réalité géré par <kbd>bash</kbd> qui est donc une sorte de langage. Dans une première approche cela n’a pas beaucoup d’importance, mais cela permet de comprendre qui fait quoi.  
</p>

	<a name='chapter_5'></a>
  <h2>Trouver son chemin</h2>
	
<p>
Revenons donc à nos moutons. Lorsque l’on ouvre une console, vous êtes dans un dossier indiqué dans l’invite. Normalement ce dossier est votre dossier utilisateur qui se trouve dans le dossier <kbD>home</kbd> suivi de votre nom d’utilisateur. Vous pouvez le vérifier grâce à la commande <kbD>pwd</kbd> qui va renvoyer le dossier en court :

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>pwd</div><div class='result'>/home/gaston</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
</p>  
  Pour change de dossier courrant, vous utilisez la commande <kbD>cd</kbd> suivi du chemin visé. 

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>cd ..</div><div class='command'><span class='prompt'>gaston$</span>pwd</div><div class='result'>/home</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Enfin, la commande <kbd>cd</kbd> lancée tout seule (sans paramètres) vous transporte dans votre dossier personnel. 
</p>

	<a name='chapter_6'></a>
  <h2>Entrées et sorties standard</h2>
	

<p>Commençons par la classique commande <kbD>ls</kbd> (l’équivalent de <kbd>dir</kbd> sous DOS/Windows) :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>ls</div><div class='result'>Bureau/ tmp/</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  La commande <kbd>ls</kbD>, qui donne la liste des fichiers dans le dossier où l'on se trouve, nous a renvoyé cette liste à l'écran. En réalité la commande a envoyé la liste dans la <kbD>sortie standard</kbd> qui par défaut est affichée à l'écran. Pour s'en convaincre, utilisons une nouvelle syntaxe, la redirection, que nous expliquerons mieux plus loin :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>ls > liste</div><div class='command'><span class='prompt'>gaston$</span>cat liste</div><div class='result'>Bureau/</div><div class='result'>tmp/</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
   La syntaxe <kbd>&gt;</kbd> a <b>redirigé</b> la sortie standard non plus vers l'écran mais vers un fichier. La commande <kbd>cat</kbd> va lire le fichier et l'envoyer sur sa sortie standard. Et vu que là, il n'y a pas de <kbd>&gt;</kbd>, cela sort directe sur l'écran. Voyons maintenant la même chose, mais pour un message d'erreur :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>ls truc > liste</div><div class='result'>ls: ne peut accéder truc: Aucun fichier ou répertoire de ce type</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
   Surprise, notre message d'erreur, lui, ne finit pas dans le fichier. La raison en est que toutes les commandes ont en réalité deux canaux de sortie : la sortie standard, et la sortie des erreurs. Si je veux rediriger les erreurs dans un fichier, je vais devoir modifier légèrement ma syntaxe :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>ls truc 2> erreur</div><div class='command'><span class='prompt'>gaston$</span>cat erreur</div><div class='result'>ls: ne peut accéder truc: Aucun fichier ou répertoire de ce type</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Cette fois c'est la sortie des erreurs que j'ai redirigé vers un fichier, et du coup, ma commande ls, redeviens muette et l'erreur est bien contenue dans le fichier <kbD>erreur</kbd>. 
</p>
<p>
  On appelle la sortie standard <kbd>stdout</kbd>, et la sortie des erreurs <kbd>stderr</kbd>. 
</p>
<p>
  Maintenant que nous savons comment gérer ce qui « sort » d’une commande, voyons ce que l’on peut y faire « entrer » :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>cat > un_message</div><div class='result'>blablabla</div><div class='result'>CTRL-D</div><div class='command'><span class='prompt'>gaston$</span>cat un_message</div><div class='result'>blablabla</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Comme nous l'avons vu dans les exemples précédents, la commande <kbD>cat</kbd> prend en entrée un fichier. Mais si l'on omet ce fichier, c'est l'entrée standard <kbd>stdin</kbd> qui est utilisée par la commande.  Et comme, par défaut, l'entrée standard d'une commande, c'est le clavier, la première ligne correspond à copier chaque caractère que vous tapez et l'envoyer sur la sortie standard. Sortie standard qui est redirigée sur notre fichier <kbd>mon_message</kbd>. 
</p>
<p>
  Une commande unix est donc une application, souvent placée dans le dossier /usr/bin, qui lorsqu’elle est exécutée, prend des données dans son entrée standard (stdin), ou de ses paramètres, et écrit ses résultats dans la sortie standard (stdout) et ses erreurs sans la sortie des erreurs (stderr). Par défaut, si rien n’est précisé, ce qui est tapé au clavier est envoyé sur l’entrée standard, et tout ce que l’application écrit, que ce soit des erreurs ou des résultat, est envoyé sur l’écran.
</p>
<p>
  Maintenant nous allons voir comment jouer aux legos avec nos commandes, grâce aux redirections et aux tubes.
</p>

	<a name='chapter_7'></a>
  <h2>Jouons aux legos…</h2>
	
<p>
  Nous avons déjà vu la syntaxe <kbd>&gt;</kbd>. Elle permet de rediriger une des deux sorties vers un fichier. Voyons tout ce que l'on peut faire avec cela :
   
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0"># envoyer la sortie standard (stdin) vers un fichier. Les deux syntaxes sont équivalentes. </span><br />
commande <span class="sy0">&gt;</span> fichier<br />
commande <span class="nu0">1</span><span class="sy0">&gt;</span> fichier<br />
<br />
<span class="co0"># envoyer la sortie des erreurs (stderr) vers un fichier</span><br />
commande <span class="nu0">2</span><span class="sy0">&gt;</span> fichier<br />
<br />
<span class="co0"># Plus fort, envoyer toutes les erreurs vers la sortie standard, et la sortie standard vers un fichier</span><br />
commande <span class="nu0">2</span><span class="sy0">&gt;&amp;</span><span class="nu0">1</span> <span class="sy0">&gt;</span> fichier<br />
<br />
<span class="co0"># une version simplifiée de la commande précédente, stderr et stdout vont tout deux dans le fichier</span><br />
commande <span class="sy0">&amp;&gt;</span> fichier
  </div>
  
  </div>
</p>
<p>
  Maintenant, la question que les amateurs de legos se posent déjà, c'est « comment envoyer le résultat d'une commande comme entrée d'une autre commande ». En effet, la notation <kbd>&gt;</kbd> est réservée aux fichiers, on ne peut donc pas envisager des choses comme <kbd>commande1 > commande2</kbd>. La solution est d'utiliser un tube (pipe). 
</p>
<p>
Voyons comment utiliser l'indispensable commande <kbd>grep</kbd> qui permet de chercher dans ce que vous lui donnez en entrée (stdin) une chaîne de caractère. Par exemple imaginons que nous voulions chercher le mot <kbd>Bureau</kbd> dans notre liste de fichiers  renvoyée par <kbd>ls</kbd> :

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>ls | grep -i bureau</div><div class='result'>Bureau</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
   Voilà donc comment jouer aux legos. La traduction du <kbd>|</kbd> est <q>redirige la sortie de la commande ls vers l'entrée de la commande grep</q>. Le <kbd>-i</kbd> indique seulement à Grep de ne pas faire de différence majuscules/minuscules.
</p>
<p>
 Maintenant nous pouvons combiner tout ce que nous avons vu en une ligne un peu barbare :

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>ls toto 2>&1 | grep -i fichier > resultat</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Mon exemple est idiot en soit mais c'est juste un exemple. Il s'agit là de dire : redirige les erreurs de la commande <kbd>ls</kbd> sur la sortie standard, cherche le mot "fichier" dedans et stockes le résultat dans le fichier "resultat". 
</p>
<p>
Nous verrons des exemples un peu moins idiots plus loin <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>

	<a name='chapter_8'></a>
  <h2>Substitutions</h2>
	
<p>
  Alors nous avons vu comment utiliser la sortie d’une commande comme entrée d’une seconde commande. Maintenant comment utilisez cette sortie comme <kbd>paramétre</kbd> de la seconde commande. Simplement avec une substitution. Imaginons que nous voulions convertir tous les fichiers jpeg du dossier courrant en un seul fichier pdf. Une liste des fichiers jpeg peut être obtenu par la commande <kbd>ls | grep jpg</kbd>. Maintenant nous allons utiliser la notation <kbd>$()</kbd> pour l’injecter dans la commande <kbd>convert</kbd> :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  Convert $<span class="br0">&#40;</span><a target="blank" href="http://pwet.fr/man/linux/commandes/ls"><span class="kw2">ls</span></a> <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> jpeg<span class="br0">&#41;</span> resultat.pdf
  </div>
  
  </div>
</p>
<p>
   Le membre <kbd>$(ls | grep jpeg)</kbd> va être substitué lorsque vous validez la ligne par le résultat de la commande entre parenthèses. Convert va donc avoir en paramètre une liste de fichier jpeg en plus du paramètre final <kbd>resultat.pdf</kbd>. 
</p>
<p>
  Bon, ceci est un exemple, et comme beaucoup d’exemples il est idiot car j’aurais pu obtenir le même résultat sans substitutions par un simple <kbd>convert *.jpeg resultat.pdf</kbd> ou encore en utilisant plutôt <kbd>$(ls * .jpeg)</kbd>. Mais il reste néanmoins intéressant car le caractère * est en réalité lui aussi une substitution. En effet, contrairement à ce que l’on peut imaginer, ce n’est ma la commande qui va recevoir le <kbd>*.jpeg</kbd> et en déduire une liste de fichier, mais <kbd>bash</kbd> qui va lui-même chercher cette liste et faire une substitution. Une conséquence directe de cela est que si votre <kbd>*.jpeg</kbd>  renvoie trop de fichiers, le système vous renverra une erreur pour cause de trop nombreux paramètres passé à la commande. 
</p>
<div class='inline-box note'>
   Une autre syntaxe pour la substitution consiste à utiliser <kbd>`commande`</kbd>. C'est exactement la même chose que <kbd>$(commande)</kbd> sauf que son utilisation est découragé pour cause d'obsolescence. Plus d'informations <a class='external' target='_blank' href='http://bash-hackers.org/wiki/doku.php/scripting/obsolete' >ici</a>
</div>

	<a name='chapter_9'></a>
  <h2>Obtenir de l'aide</h2>
	
<p>
   Unix c'est un énorme paquet de commandes et chaque commande possédant ces paramètres propres, il est illusoire d'imaginer les connaître tous. La solution est l'incontournable commande <kbd>man</kbd> qui s'utilise suivi de la commande dont on désire connaître le fonctionnement, par exemple pour <kbd>rsync</kbd> :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/man"><span class="kw2">man</span></a> <a target="blank" href="http://pwet.fr/man/linux/commandes/rsync"><span class="kw2">rsync</span></a>
  </div>
  
  </div>
</p>
<p>
  Une fois l'aide affichée, il est possible d'en sortir en tapant <kbd>q</kbd>, se déplacer avec les flêches mais aussi de rechercher des choses dedans en utilisant un mythique syntaxe <kbd>/chose_a_chercher</kbd> et en validant. La chaîne cherchée devrait s'afficher en surligné. 
</p>
<p>
   Enfin, pour les kdeistes, une version graphique du man est utilisable dans konqueror en tapant l'URL spéciale <kbd>man:/commande</kbd>. 
</p>
<p>
  
</p>
</p>
<p>
  C’est tout pour la théorie, maintenant voyons des exemples issus de la « vraie vie ».
</p>

	<a name='chapter_10'></a>
  <h2>Exemples concrêts</h2>
	
<h3>La substitution qui tue</h3>
<p>
   Pour rester dans le domaine de la substitution, voyons un exemple d’une efficacité redoutable mais à manier avec <b>beaucoup de précautions</b>. Imaginons que nous voulions désinstaller TOUT kde d’un coup. Avec une interface graphique cela prendrait un temps fou, alors qu’avec une simple ligne de commande :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  rpm –e –nodeps $<span class="br0">&#40;</span>rpm –qa <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> kde<span class="br0">&#41;</span>
  </div>
  
  </div>
</p>
<p>
  Attention, cette ligne est violente. La commande entre parenthèse nous permet d’obtenir la liste exhaustive de tous les paquets installés qui contiennent la chaîne <kbd>kde</kbd>, et on substitue simplement cette liste comme paramètres dans la commande <kbd>rpm –e –nodeps</kbd> qui vas <b>sans vérification de dépendance</b> les désinstaller. 
</p>
<h3>Télécharger et décompresser en même temps</h3>
<p>
  Dans cet exemple, imaginons que nous voulions décompresser un fichier <b>directement à partir d'internet</b> :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/wget"><span class="kw2">wget</span></a> -O - http:<span class="sy0">//</span><a target="blank" href="http://pwet.fr/man/linux/commandes/ftp"><span class="kw2">ftp</span></a>.drupal.org<span class="sy0">/</span>files<span class="sy0">/</span>projects<span class="sy0">/</span>zental<span class="nu0">-5</span>.x<span class="nu0">-1</span>.x-dev.<a target="blank" href="http://pwet.fr/man/linux/commandes/tar"><span class="kw2">tar</span></a>.gz <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/tar"><span class="kw2">tar</span></a> -zxv -f -
  </div>
  
  </div>
</p>
<p>
   Magique non ? Ici nous avons indiqué à la commande <kbd>wget</kbd> de télécharger en envoyant ce qu'elle télécharge directement sur la sortie standard par <kbd>-O -</kbd>. Ensuite grâce au tube, nous avons envoyé ce résultat sur la commande <kbd>tar</kbd> à qui nous indiquons de ne pas décompresser un fichier mais directement son entrée standard par le paramètre <kbd>-f -</kbd>.
</p>
<p>
  Ce n'est pas une règle générale mais beaucoup de commande unix fonctionnent ainsi. C'est une sorte de convention qui dit que le caractère <kbD>-</kbd> à la place d'un nom de fichier veut dire entrée ou sortie standard selon le contexte. 
</p>
<p>
  De la même manière il est possible de télécharger et graver sur un CD en même temps, mais cette fois en utilisant la commande <kbd>cdrecord</kbd> au lieu de <kbd>tar</kbd>. 
</p>
<h3>Synchroniser une base de donnée distante</h3>
<p>
  Il est possible de faire la même chose que plus haut, mais à distance grâce à l'indispensable commande <kbd>ssh</kbd>. Par exemple, imaginons que nous avons deux bases de données postgresql. Une en locale, l'autre sur un serveur distant. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0"># on commence par supprimer la base de donnée locale</span><br />
dropdb ma_base -U postgres<br />
<span class="co0"># on en recré une nouvelle </span><br />
createdb --<span class="re2">encoding=</span>UNICODE -U postgres ma_base<br />
<br />
<span class="co0"># Et là on va synchroniser le tout en une seule ligne</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ssh"><span class="kw2">ssh</span></a> mon_serveur <span class="st0">&quot;pg_dump -U postgres ma_base -h localhost&quot;</span> <span class="sy0">|</span> psql -U postgres &nbsp;ma_base
  </div>
  
  </div>
</p>
<p>
  La même chose est possible avec MySql. Tout d'abord je me connecte en ssh sur le serveur distant et j'y lance la commande qui est entre les deux <kbd>"</kbd>. Cette commande demande à postgres de créer un fichier SQL de la base distante et de l'envoyer sur la sortie standard. Lorsque la commande distante s'exécute, ssh transmet en local son résultat sur sa sortie standard. Sortie standard que je redirige par un tube vers la commande <kbd>pgsql</kbd> qui va recréer ma base en locale, au fur et à mesure de l'arrivée des données distantes. Lorsque c'est terminé, j'ai la même base en local et en distant.
</p>
<p>
 Le seul problème c'est qu'une base, c'est gros, ce qui serait sympa c'est de compresser tout cela en temps réel... Pas de problème <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/ssh"><span class="kw2">ssh</span></a> mon_serveur <span class="st0">&quot;pg_dump -U postgres ma_base -h localhost | gzip&quot;</span> <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/gunzip"><span class="kw2">gunzip</span></a> <span class="sy0">|</span> psql -U postgres &nbsp;ma_base
  </div>
  
  </div>
</p>
<p>
  Et voilà, j'ai rajouté un tube dans la commande distante qui va compresser le script SQL avant de l'envoyer dans la sortie standard. Et à l'arrivée, j'ai rajouté un <kbD>gunzip</kbd> pour décompresser avant exécution des commandes SQL. Et le tour est joué.
</p>
<h3>Connaître les fichiers les plus gros</h3>
<p>
  Là nous allons utiliser trois nouvelles commandes : du, sort et more. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/du"><span class="kw2">du</span></a> . -xb --block-<span class="re2">size=</span>1M <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/sort"><span class="kw2">sort</span></a> -rn <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/more"><span class="kw2">more</span></a>
  </div>
  
  </div>
</p>
<p>
   La commande <kbd>du</kbd> va me sortir de manière récursives la liste de tous les fichiers avec leur taille. La commande <kbd>sort</kbd> va opérer un tri de cette liste pour mettre les plus gros fichiers en tête et la commande <kbd>more</kbd>, indispensable, va juste bloquer l'affichage page par page. 
</p>
<p>
  La commande more fait partie d'un jeu de commandes ultra-utilisées avec <kbd>head</kbd> et <kbd>tail</kbd>. Head permet de ne prendre que les premières lignes de l'entrée standard, et tail fait l'inverse, et ne prend que les dernières lignes. Ainsi, pour avoir les 10 premiers fichiers les plus gros :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/du"><span class="kw2">du</span></a> . -xb --block-<span class="re2">size=</span>1M <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/sort"><span class="kw2">sort</span></a> -rn <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/head"><span class="kw2">head</span></a>
  </div>
  
  </div>
</p>
<p>
  Et pour les dix fichiers les plus petit :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/du"><span class="kw2">du</span></a> . -xb --block-<span class="re2">size=</span>1M <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/sort"><span class="kw2">sort</span></a> -rn <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/tail"><span class="kw2">tail</span></a>
  </div>
  
  </div>
</p>

	<a name='chapter_11'></a>
  <h2>Conclusion</h2>
	
<p>
   La ligne de commande permet avec un investissement relativement faible, d'obtenir des résultats qu'il est juste impossible d'avoir avec une interface graphique. Interface graphique et ligne de commande sont donc complémentaires, la première cherchant à rendre simple les opérations les plus courantes, la seconde à permettre tout le reste. J'espère en tout cas que cette petite introduction vous donnera envie d'aller plus loin. 
</p>    ]]></content>
  </entry>
</feed>
