<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Basile+S+%28phorum%29</id>
	<title>Lea Linux - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Basile+S+%28phorum%29"/>
	<link rel="alternate" type="text/html" href="https://lea-linux.org/documentations/Sp%C3%A9cial:Contributions/Basile_S_(phorum)"/>
	<updated>2026-04-22T10:04:28Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Tenir_compte_de_la_s%C3%A9curit%C3%A9_au_quotidien&amp;diff=12836</id>
		<title>Tenir compte de la sécurité au quotidien</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Tenir_compte_de_la_s%C3%A9curit%C3%A9_au_quotidien&amp;diff=12836"/>
		<updated>2006-06-26T17:28:08Z</updated>

		<summary type="html">&lt;p&gt;Basile S (phorum) : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;D&#039;abord et avant tout il faut être à l&#039;aise avec les concepts essentiels de [http://fr.wikipedia.org/wiki/Linux linux]. Donc documentez vous sur ce système et son langage de commande.&lt;br /&gt;
&lt;br /&gt;
Ensuite, veillez à ne pas démarrer des services inutiles.&lt;/div&gt;</summary>
		<author><name>Basile S (phorum)</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Glibc&amp;diff=12456</id>
		<title>Glibc</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Glibc&amp;diff=12456"/>
		<updated>2006-04-21T10:10:46Z</updated>

		<summary type="html">&lt;p&gt;Basile S (phorum) : /* Plus d&amp;#039;infos sur cette partie (plugins) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Développer sous Linux]]&lt;br /&gt;
= Les Librairies C (linux) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;Les Librairies C (linux)&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;par [mailto:xgarreau@club-internet.fr Xavier GARREAU (alaide)]&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;Dans cette page, je vais évoquer la rédaction, la compilation et l&#039;utilisation des librairies en C. Je traiterai avant tout de développement sous linux bien que la majorité des explications soient applicables à d&#039;autres systèmes d&#039;exploitation, y compris ceux qu&#039;on voudrait voir passer par la fenêtre ;-).&amp;lt;/div&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Intérêt ? ===&lt;br /&gt;
&lt;br /&gt;
Imaginez : Vous avez développé une série de fonctions très utiles pour un projet, prenons l&#039;exemple d&#039;un tri par bulles. Un jour, vous devez effectuer une nouvelle série de tris. Vous ouvrez le projet et passez la journée à faire du copier coller ?!?! &#039;&#039;&#039;&#039;&#039;NON !!!&#039;&#039;&#039;&#039;&#039; car vous aviez pensé à créer un librairie contenant la fonction principale du tri, n&#039;est ce pas ? &amp;lt;br /&amp;gt; Les librairies permettent de se constituer des bibliothèques de fonctions réutilisables et distribuables.&lt;br /&gt;
&lt;br /&gt;
Vous voulez un autre avantage des librairies ?&amp;lt;br /&amp;gt; On les compile à part ! Si vous avez comme moi un pc qui se fait vieux, vous savez que la compilation peut prendre pas mal de temps. La bonne nouvelle c&#039;est qu&#039;une fois les librairies compilées, vous ne les recompilez pas à chaque fois que vous recompilez votre projet. Tout au plus, vous les liez, s&#039;il s&#039;agit de bibliothèques statiques.&lt;br /&gt;
&lt;br /&gt;
=== Qu&#039;est ce qu&#039;il y a dedans ? ===&lt;br /&gt;
&lt;br /&gt;
Une librairie est composée d&#039;un fichier d&#039;en têtes (headers en anglais, d&#039;ou le .h), ce sont les fichiers .h qui doivent vous dire quelque chose, non ? Et d&#039;un partie binaire. &amp;lt;br /&amp;gt; Le fichier d&#039;en têtes, permet de &amp;quot;déclarer&amp;quot; les fonctions présentes dans la librairie, le type de valeurs qu&#039;elles renvoient et les paramètres à leur passer. &amp;lt;br /&amp;gt; La partie binaire est constituée d&#039;un ou plusieurs fichiers c compilés. Ces fichiers c contiennent l&#039;implémentation des prototypes de fonctions déclarées dans le fichier d&#039;en têtes. &amp;lt;br /&amp;gt; Vous pouvez modifier le code de la librarie autant que vous le désirez, du moment que vous respectez les prototypes définis dans le fichier .h.&lt;br /&gt;
&lt;br /&gt;
=== Statique, Dynamique ? ===&lt;br /&gt;
&lt;br /&gt;
Ouais, entrons dans le vif du sujet. Qu&#039;est ce qu&#039;une librairie statique ? et une librairie dynamique ? Quelles sont les avantages et inconvénients de chacune ?&lt;br /&gt;
&lt;br /&gt;
* Quand vous utilisez une librairie statique (généralement .a sous linux, .lib sous ouinouin) la librairie est &#039;&#039;liée&#039;&#039; à l&#039;exécutable généré. C&#039;est à dire que vous obtenez un fichier exécutable relativement &amp;quot;lourd&amp;quot;. &amp;lt;br /&amp;gt;&#039;&#039;&#039;D&#039;autre part&#039;&#039;&#039;, si vous apportez des modifications à la librairie, vous devez recompiler la librairie &#039;&#039;&#039;ET&#039;&#039;&#039; l&#039;exécutable. &amp;lt;br /&amp;gt;&#039;&#039;&#039;Bon coté&#039;&#039;&#039; : lorsque vous distribuez votre application, l&#039;exécutable contient tout ce qui lui est nécessaire pour fonctionner, ce qui évite les problèmes de dépendances. &lt;br /&gt;
* L&#039;utilisation des librairies dynamiques apporte plusieurs avantages : &lt;br /&gt;
*# La librairie est liée au programme qui l&#039;utilise lors de l&#039;exécution, l&#039;exécutable distribué est ainsi plus léger que dans le cas d&#039;une librairie statique. &lt;br /&gt;
*# La librarie n&#039;est chargée qu&#039;une fois en mémoire, même si elle est utilisée par plusieurs exécutables. &lt;br /&gt;
*# Lors de modifications apportées à la librarie, l&#039;application l&#039;utilisant n&#039;a pas besoin d&#039;être recompilée, à la condition toutefois que ces changements respectent les prototypes définis dans le fichier d&#039;en têtes. &lt;br /&gt;
&amp;lt;br /&amp;gt;Mais il y a aussi des inconvénients : &lt;br /&gt;
*# Pour exécuter une application faisant appel à une librarie dynamique, vous devez posséder ces librairies et elles doivent pouvoir être trouver par le système. Nous verrons plus loin quelques façons de vérifier tout celà. &lt;br /&gt;
*# Le temps de lancement peut être plus long, étant donné que la liaison se fait lors de l&#039;exécution. &lt;br /&gt;
&amp;lt;br /&amp;gt;&#039;&#039;&#039;Nota Bene&#039;&#039;&#039; : les liens avec les librairies dynamiques ne se font pas toujours lors de l&#039;exécution, un programme peut en effet charger lui même les librairies dont il a besoin quand il en a besoin (voir les fonctions dlopen() et dlsym()), Celà est utile pour construire l&#039;application au fur et à mesure de son exécution. Imaginez par exemple que vous écriviez un programme de retouche d&#039;image, pourquoi charger les libraries de traitement de fichier jpeg si pendant une &amp;quot;&#039;&#039;session&#039;&#039;&amp;quot; l&#039;utilisateur ne se sert que de fichiers .png ? &lt;br /&gt;
&lt;br /&gt;
=== Plus d&#039;infos sur cette partie ? ===&lt;br /&gt;
&lt;br /&gt;
Consultez les pages man de dlopen et dlsym et celles qui y sont conseillées et tapant dans la console&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 	man dlopen&lt;br /&gt;
 	man dlsym&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces fonctions permettent notamment de réaliser des &amp;quot;plugins&amp;quot;, c&#039;est à dire des bout de codes qui sont chargés durant l&#039;exécution, pour permettre par exemple d&#039;étendre les fonctionalités d&#039;un programme sans le modifier (à condition que ça été prévu). En pratique, un programme peut charger par dlopen beaucoup (des milliers au moins) de &amp;quot;plugins&amp;quot; ensemble.&lt;br /&gt;
&lt;br /&gt;
Une autre possibilité est même de méta-programmer, c&#039;est à dire d&#039;écrire un programme qui génère le code pour le traitement approprié des données. Il suffit pour ça (par exemple) de générer à l&#039;exécution du code C dans un fichier &#039;&#039;gen.c&#039;&#039;, de lancer depuis le programme sa compilation (avec la fonction &#039;&#039;system&#039;&#039; du C par exemple) en exécutant la commande&lt;br /&gt;
&amp;lt;code&amp;gt;gcc -O -fPIC -shared gen.c -o gen.so&amp;lt;/code&amp;gt;, puis de charger le code obtenu par &#039;&#039;dlopen&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Rédaction : remarques ==&lt;br /&gt;
&lt;br /&gt;
=== Quelques généralités ===&lt;br /&gt;
&lt;br /&gt;
Si vous voulez que votre librairie soit réutilisable et efficace, vous devez respecter quelques notions fondamentales de la programmation.&lt;br /&gt;
&lt;br /&gt;
* Limitez au minimum les variables globales. Préférez, lorsque c&#039;est possible, de passer des paramètres au fonctions plutôt que d&#039;utiliser les variables globales. C&#039;est plus facile de s&#039;y retrouver et ça occuppe moins de mémoire. &amp;lt;br /&amp;gt;&#039;&#039;&#039;Par exemple&#039;&#039;&#039;, si vous avez une fonction qui traite les données d&#039;un tableau dont vous devez connaitre le nombre d&#039;éléments : &amp;lt;blockquote&amp;gt;&lt;br /&gt;
{| width=&amp;quot;60%&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &#039;&#039;&#039;Pas Bien !&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cette solution fait appel à une variable globale pour connaitre la taille du tableau. C&#039;est déconseillé !&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#fcfcd8&amp;quot; |&lt;br /&gt;
/*&lt;br /&gt;
  *  ...&lt;br /&gt;
  */&lt;br /&gt;
 int tailleTab;&lt;br /&gt;
 long * traiteTab (long * tab) {&lt;br /&gt;
 /*&lt;br /&gt;
  *&lt;br /&gt;
  * Traitement des données&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 }&lt;br /&gt;
 /*&lt;br /&gt;
  *  ...&lt;br /&gt;
  */&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| width=&amp;quot;60%&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &#039;&#039;&#039;Bien !&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Ici, la taille du tableau est passée en paramètre à la fonction. C&#039;est mieux !&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#fcfcd8&amp;quot; |&lt;br /&gt;
/*&lt;br /&gt;
  *  ...&lt;br /&gt;
  */&lt;br /&gt;
 long * traiteTab (long * tab, int tailleTab) {&lt;br /&gt;
 /*&lt;br /&gt;
  *&lt;br /&gt;
  * Traitement des données&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 }&lt;br /&gt;
 /*&lt;br /&gt;
  *  ...&lt;br /&gt;
  */&lt;br /&gt;
|}&lt;br /&gt;
 &amp;lt;/blockquote&amp;gt; &lt;br /&gt;
* Commentez vos sources ! Comment voulez vous vous y retrouver rapidement dans le code de quelqu&#039;un d&#039;autre ou même le vôtre si il n&#039;y a aucun commentaire ? Celà est surtout vrai pour les fichiers d&#039;en tête, expliquez ce que font les fonctions et ce que sont les arguments. (Je sais, c&#039;est moins chiant à dire qu&#039;à faire) &lt;br /&gt;
* Evitez le plus possible les structures spécifiques à une application particulière. Par exemple, si vous utilisez des chaines de moins de 50 caractères dans votre application, ne limitez pas vos variables à cette valeur. Qui sait si votre patron ne va pas décider dans deux jours que les chaînes doivent pouvoir comporter 1000 caractères ? (Je vous jure que ça arrive ! ;-) ). Préférez toujours, quand c&#039;est possible, une allocation dynamique de mémoire à vos variables. (voir malloc(), realloc(); calloc() et free()) &lt;br /&gt;
* Lorsqu&#039;on utilise des fichiers d&#039;en têtes abondamment, il y a un risque d&#039;en inclure un plusieurs fois, ce qui allonge le temps de compilation et produit éventuellement des erreurs. pour pallier à ce problème, on utilise la clause #ifndef __NOM_FICHIER_H. &amp;lt;br /&amp;gt;&#039;&#039;&#039;Par exemple&#039;&#039;&#039;, si votre fichier s&#039;appelle monTest.h, placez ceslignes au début et à la fin du fichier: &amp;lt;blockquote&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
| bgcolor=&amp;quot;#fcd8d8&amp;quot; | Si le fichier à été inclus, _MON_TEST_H est défini et il ne le sera pas à nouveau.&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#fcfcd8&amp;quot; |&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 #ifndef _MON_TEST_H&lt;br /&gt;
 #define _MON_TEST_H 1&lt;br /&gt;
 /*&lt;br /&gt;
  *  ...&lt;br /&gt;
  *ici, le contenu normal du fichier monTest.h&lt;br /&gt;
  *  ...&lt;br /&gt;
  */&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 &amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Les &amp;quot;chemins&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;La directive &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; : pour inclure un fichier dans un autre en c, on utilise la directive &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt;On spécifie le chemin relatif entre le fichier incluant et le fichier inclus, par exemple : &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;#include &amp;quot;mesH/monTest.h&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;ou bien on place le fichier .h dans le répertoire ou le compilateur s&#039;attend à trouver les fichiers .h. (regardez dans /usr/include par exemple) et on donne le chemin relatif par rapport à ce répertoire, par exemple : &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;#include &amp;lt;orb/orbit.h&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&#039;&#039;&#039;Nota Bene&#039;&#039;&#039; : On peut également spécifier d&#039;autres chemins de recherche grâce à l&#039;option -I de gcc, par exemple, pour y inclure le répertoire courant : &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;gcc -I. etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour devenir incollables sur ces amusantes petites choses, apprenez par coeur les man pages de gcc et ld. ;-)&lt;br /&gt;
&lt;br /&gt;
=== Plus d&#039;infos sur cette partie ? ===&lt;br /&gt;
&lt;br /&gt;
Consultez les pages man des fonctions d&#039;allocation dynamique de mémoire, du compilateur, du linker et celles qui y sont conseillées et tapant dans la console :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 	man malloc&lt;br /&gt;
 	man realloc&lt;br /&gt;
 	man calloc&lt;br /&gt;
 	man free&lt;br /&gt;
 	man gcc&lt;br /&gt;
 	man ld&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On rentre enfin dans le vif du sujet avec cette partie. On va en effet maintenant suivre un exemple pas à pas pour construire une librarie, la compiler, l&#039;utiliser dans un exécutable sous ses formes statiques et dynamiques. &amp;lt;br /&amp;gt; On va prendre l&#039;exemple d&#039;un librairie comportant une fonction permettant de trier un tableau contenant des entiers longs. La méthode de tri sera le tri par bulles. Je ne suis pas vraiment sûr que ce soit cet algorithme là mais ça marche alors ... Roule !&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rédaction : le fichier d&#039;en têtes ==&lt;br /&gt;
&lt;br /&gt;
Bien entrons dans le dedans du vif du sujet ! ouvrez un éditeur de texte et tapez ça dans un fichier tri_a_bulles.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| bgcolor=&amp;quot;#fcfcd8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot; | &#039;&#039;&#039;tri_a_bulles.h&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 /*&lt;br /&gt;
  * tri_a_bulles.h&lt;br /&gt;
  *&lt;br /&gt;
  * Quelques fonctions pour opérations basiques sur un tableau de longs.&lt;br /&gt;
  *&lt;br /&gt;
  * auteur: Xavier GARREAU : xgarreau@club-internet.fr&lt;br /&gt;
  *&lt;br /&gt;
  * web : http://perso.club-internet.fr/xgarreau/&lt;br /&gt;
  *&lt;br /&gt;
  * dmodif: 13.03.2000&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 #ifndef _TRI_A_BULLES_H&lt;br /&gt;
 #define _TRI_A_BULLES_H 1&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * test_case_tableau : Dans le tableau pointé par addr_tableau,&lt;br /&gt;
  *   Vérifie que la case case case_tableau est bien placée par rapport à celle qui la précède&lt;br /&gt;
  *   Si ce n&#039;est pas le cas, permute les cases et se rappelle sur la case précédente.&lt;br /&gt;
  *   La récurrence s&#039;arrête quand&lt;br /&gt;
  *     la case case case_tableau est bien placée par rapport à celle qui la précède&lt;br /&gt;
  *     ou bien si case_tableau vaut prem_case_tableau.&lt;br /&gt;
  *   Ne renvoie rien.&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 void test_case_tableau ( long * addr_tableau,&lt;br /&gt;
                          int taille_tableau,&lt;br /&gt;
                          int case_tableau,&lt;br /&gt;
                          int prem_case_tableau );&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * permut_cases :&lt;br /&gt;
  *   permute les valeurs des cases case_1 et case_2 du tableau pointé par addr_tableau&lt;br /&gt;
  *   Ne renvoie rien.&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 void permut_cases ( long * addr_tableau,&lt;br /&gt;
                     int case_1,&lt;br /&gt;
                     int case_2 );&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * test_tableau :&lt;br /&gt;
  *   renvoie le tableau pointé par addr_tableau trié (ordre croissant)&lt;br /&gt;
  *     de la case prem_case_tableau&lt;br /&gt;
  *     à la case taille_tableau-1&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 long * test_tableau ( long * addr_tableau,&lt;br /&gt;
                       int prem_case_tableau,&lt;br /&gt;
                       int taille_tableau );&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * nb_cases_tableau :&lt;br /&gt;
  *   Renvoie le nombre de cases du tableau pointé par addr_tableau&lt;br /&gt;
  *     càd nombre de cases allouées&lt;br /&gt;
  *     ou première case contenant (long)NULL si le tableau en contient une.&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 int nb_cases_tableau ( long * addr_tableau );&lt;br /&gt;
&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous êtes familier avec les fichiers .h, pas de problème. Sinon, disons qu&#039;on se contente de définir les &amp;quot;prototypes&amp;quot; des fonctions, on écrira leur corps dans un fichier .c. &amp;lt;br /&amp;gt;Les fichiers .h permettent au compilateur de connaitre les prototypes des fonctions qu&#039;il rencontre dans les différents fichiers.c qui les utilisent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Je m&#039;explique !&#039;&#039;&#039; Les fonctions définies dans un fichier .c peuvent être utilisées dans un autre, ça vous le savez ! (hein ? vous le savez ?) Il suffit de préciser au compilateur tous les fichiers à compiler (&amp;lt;code&amp;gt;gcc fic1.c fic2.c ... ficn.c&amp;lt;/code&amp;gt;). Si par hasard vous commettez une erreur en appelant une fonction, vous verrez que la compilation se passera sans problème, &#039;&#039;&#039;MAIS&#039;&#039;&#039;, lors de l&#039;exécution vous obtiendrez des résultats inattendus ou pire, une erreur. Brrrrrrrrrrrr ... Flippant non ?&lt;br /&gt;
&lt;br /&gt;
Bon, si on programmait ? Un petit peu de récursivité maintenant ? &#039;&#039;&#039;&#039;&#039;GO ! BANZAI !&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Rédaction : le fichier c ==&lt;br /&gt;
&lt;br /&gt;
Ouvrez un éditeur de texte et tapez ça dans un fichier tri_a_bulles.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| bgcolor=&amp;quot;#fcfcd8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot; | &#039;&#039;&#039;tri_a_bulles.c&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 /*&lt;br /&gt;
  * tri_a_bulles.c&lt;br /&gt;
  *&lt;br /&gt;
  * Quelques fonctions pour opérations basiques sur un tableau de longs.&lt;br /&gt;
  *&lt;br /&gt;
  * auteur: Xavier GARREAU : xgarreau@club-internet.fr&lt;br /&gt;
  *&lt;br /&gt;
  * web : http://perso.club-internet.fr/xgarreau/&lt;br /&gt;
  *&lt;br /&gt;
  * dmodif: 13.03.2000&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 #include &amp;quot;tri_a_bulles.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 void test_case_tableau ( long * addr_tableau,&lt;br /&gt;
                          int taille_tableau,&lt;br /&gt;
                          int case_tableau,&lt;br /&gt;
                          int prem_case_tableau ) {&lt;br /&gt;
   if ( case_tableau &amp;gt; prem_case_tableau )&lt;br /&gt;
     if (addr_tableau[case_tableau] &amp;lt; addr_tableau[case_tableau-1]) {&lt;br /&gt;
       permut_cases ( addr_tableau,&lt;br /&gt;
                      case_tableau,&lt;br /&gt;
                      case_tableau-1 );&lt;br /&gt;
       test_case_tableau ( addr_tableau,&lt;br /&gt;
                           taille_tableau,&lt;br /&gt;
                           case_tableau-1,&lt;br /&gt;
                           prem_case_tableau );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void permut_cases ( long * addr_tableau,&lt;br /&gt;
                     int case_1,&lt;br /&gt;
                     int case_2 ) {&lt;br /&gt;
   long tempo;&lt;br /&gt;
&lt;br /&gt;
   tempo = addr_tableau[case_1];&lt;br /&gt;
   addr_tableau[case_1] = addr_tableau[case_2];&lt;br /&gt;
   addr_tableau[case_2] = tempo;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 long * test_tableau ( long * addr_tableau,&lt;br /&gt;
                       int prem_case_tableau,&lt;br /&gt;
                       int taille_tableau ) {&lt;br /&gt;
   int i;&lt;br /&gt;
&lt;br /&gt;
   for (i=prem_case_tableau ; i&amp;lt;taille_tableau ; i++)&lt;br /&gt;
     test_case_tableau (addr_tableau,&lt;br /&gt;
                        taille_tableau,&lt;br /&gt;
                        i,&lt;br /&gt;
                        prem_case_tableau);&lt;br /&gt;
&lt;br /&gt;
   return addr_tableau;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 int nb_cases_tableau ( long * addr_tableau ) {&lt;br /&gt;
   int nb_cases;&lt;br /&gt;
&lt;br /&gt;
   nb_cases=0;&lt;br /&gt;
   while (addr_tableau[nb_cases]) nb_cases++;&lt;br /&gt;
   return (nb_cases);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalement ça s&#039;est bien passé non ? Pas si compliqué ! &amp;lt;br /&amp;gt;Bon si on veut utiliser ça il va falloir créer une application qui en a besoin ! On y va ?&lt;br /&gt;
&lt;br /&gt;
== Rédaction : le fichier de l&#039;application ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons les sources de notre librairie, prêtes à être compilées et liées, il va falloir penser à construire une application pour utiliser les fonctions que l&#039;on y a mis ! Ce sera bientôt chose faite si vous voulez bien vous prêter encore un peu au jeu de cette dernière fastidieuse saisie.&lt;br /&gt;
&lt;br /&gt;
Ouvrez un éditeur de texte et tapez ça dans un fichier test.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| bgcolor=&amp;quot;#fcfcd8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot; | &#039;&#039;&#039;test.c&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 /*&lt;br /&gt;
  * test.c&lt;br /&gt;
  *&lt;br /&gt;
  * Une application qui utilise les fonctions de la librairie tri_a_bulles&lt;br /&gt;
  *&lt;br /&gt;
  * auteur: Xavier GARREAU : xgarreau@club-internet.fr&lt;br /&gt;
  *&lt;br /&gt;
  * web : http://perso.club-internet.fr/xgarreau/&lt;br /&gt;
  *&lt;br /&gt;
  * dmodif: 14.03.2000&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;tri_a_bulles.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 int main (int argc, char * argv[]) {&lt;br /&gt;
   long * tab;&lt;br /&gt;
   int i;&lt;br /&gt;
&lt;br /&gt;
   /* créée un tableau de 10 longs */&lt;br /&gt;
   tab = (long *)malloc( 10 * sizeof (long) );&lt;br /&gt;
&lt;br /&gt;
   /* Initialise le générateur de nombre aléatoires avec ...&lt;br /&gt;
    * L&#039;heure de lancement ...&lt;br /&gt;
    * voir man random ou man rand pour le pourquoi de la chose !!!&lt;br /&gt;
    * voir man time pour le comment !!!&lt;br /&gt;
    */&lt;br /&gt;
   srandom((int)time((time_t *)NULL));&lt;br /&gt;
&lt;br /&gt;
   /* remplit le tableau avec une suite de nombres pseudo-aléatoires&lt;br /&gt;
    * et affiche le contenu.&lt;br /&gt;
    */&lt;br /&gt;
   for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
     tab[i] = random();&lt;br /&gt;
     printf (&amp;quot;tableau[%d] = %ld\n&amp;quot;, i, tab[i]);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* Affiche le nombre de cases su tableau retourné par la librairie */&lt;br /&gt;
   printf (&amp;quot;\nTaille du tableau : %d\n&amp;quot;, nb_cases_tableau (tab));&lt;br /&gt;
&lt;br /&gt;
   /* Permute 2 cases et affiche le tableau résultant */&lt;br /&gt;
   permut_cases (tab, 2, 8);&lt;br /&gt;
   printf (&amp;quot;\nTableau après permutation des cases 2 et 8.\n&amp;quot;);&lt;br /&gt;
   for (i=0; i&amp;lt;10; i++)&lt;br /&gt;
     printf (&amp;quot;tableau[%d] = %ld\n&amp;quot;, i, tab[i]);&lt;br /&gt;
&lt;br /&gt;
   /* Trie le tableau et affiche le résultat */&lt;br /&gt;
   printf (&amp;quot;\nTableau trié par la fonction de la librairie\n&amp;quot;);&lt;br /&gt;
   test_tableau ( tab, 0, nb_cases_tableau (tab) );&lt;br /&gt;
   for (i=0; i&amp;lt;10; i++)&lt;br /&gt;
     printf (&amp;quot;tableau[%d] = %ld\n&amp;quot;, i, tab[i]);&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bien ! Maintenant qu&#039;on a tous les bouts, on va pouvoir compiler, lier, exécuter, etc...&lt;br /&gt;
&lt;br /&gt;
== Compilation de tous les binious ==&lt;br /&gt;
&lt;br /&gt;
Bon, et bien, nous y voilà, on a tout ! Il ne nous reste plus qu&#039;à tout mettre nesemble selon différentes méthodes. On va commencer par la méthode du projet unique, sans librairies. &amp;lt;br /&amp;gt; Après ça, on va se faire une petite librairie statique, ensuite, on va mettre en place une librarie dynamique (ou shared object, .so chez les pingouins, .dll chez les défenestrés !) &amp;lt;br /&amp;gt;On n&#039;abordera toutefois pas le cas de la construction des dll car franchement, ce serait perdre du temps pour rien. Je suis pour laisser les gens qui n&#039;ont que ça pour occupper leurs tristes journées générer et utiliser (de façon HYPER galère) les librairies dynamiques en envirronnement ouinouin. Ici, je pense que nous sommes entre gens sérieux, on développe donc sous linux, FreeBSD, solaris ou autres unix. Franchement, je m&#039;excuse de sembler aussi méchant vis à vis de wintruc mais quand vous aurez comparé les qualités des deux systèmes (au moins en matière de support de développement), je suis presque sûr que vous penserez comme moi.&lt;br /&gt;
&lt;br /&gt;
A la fin de cette série d&#039;infos, je vous renverrai sur les bons coins pour utiliser les makefiles, ainsi que les merveilleux outils GNU que sont autoconf, autoscan, automake et leurs copains.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; bgcolor=&amp;quot;#fcfcd8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot; |&lt;br /&gt;
=== Sans librairies ===&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Placez vous dans le répertoire du projet puis tapez ça dans la console : &lt;br /&gt;
&lt;br /&gt;
 gcc -o test test.c tri_a_bulles.c&lt;br /&gt;
&lt;br /&gt;
 Ceci génère un exécutable test que l&#039;on lance, toujours en étant placé dans le répertoire de projet, en tapant : &lt;br /&gt;
&lt;br /&gt;
 ./test&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; bgcolor=&amp;quot;#fcfcd8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot; |&lt;br /&gt;
=== Avec librairies statiques ===&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Placez vous dans le répertoire du projet puis tapez ça dans la console : &lt;br /&gt;
&lt;br /&gt;
 gcc -c test.c&lt;br /&gt;
&lt;br /&gt;
 Vous obtenez un objet binaire test.o. C&#039;est une compilation sans édition de liens. Compilez de même la librairie en tapant : &lt;br /&gt;
&lt;br /&gt;
 gcc -c tri_a_bulles.c&lt;br /&gt;
&lt;br /&gt;
 Ce qui donne tri_a_bulles.o. Comme je l&#039;ai déjà dit, si plusieurs fichiers composent la bibliothèque, on aurait tapé &lt;br /&gt;
&lt;br /&gt;
 gcc -c fic1.c fic2.c ...&lt;br /&gt;
&lt;br /&gt;
 Il faut ensuite créer la bibliothèque. Pour celà, tapez : &lt;br /&gt;
&lt;br /&gt;
 ar -q tri_a_bulles.a tri_a_bulles.o&lt;br /&gt;
&lt;br /&gt;
 S&#039;il y avait eu plusieurs fichiers ... référez vous au pages man de ar. Regardez surtout les options a, q et c ! &lt;br /&gt;
&lt;br /&gt;
Ok, maintenant on lie le tout :&lt;br /&gt;
&lt;br /&gt;
 gcc -o test test.c tri_a_bulles.a&lt;br /&gt;
&lt;br /&gt;
 Petite précision, normalement, l&#039;éditeur de liens GNU de linux c&#039;est ld. Ceci dit, ça marche avec gcc parce qu&#039;il &amp;quot;l&#039;appelle&amp;quot; alors, on ne vient pas se plaindre. Toutefois, dans le doute et pour en savoir plus, tapez &amp;lt;code&amp;gt;man ld&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On ne se laisse pas décourager pour autant et on exécute :&lt;br /&gt;
&lt;br /&gt;
 ./test&lt;br /&gt;
&lt;br /&gt;
 C&#039;est bizzare non ? Ca marche pareil. Bienvenue dans le monde du codage efficace ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; bgcolor=&amp;quot;#fcfcd8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot; |&lt;br /&gt;
=== Avec librairies dynamiques ===&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Placez vous dans le répertoire du projet puis tapez ça dans la console : &lt;br /&gt;
&lt;br /&gt;
 gcc -c test.c&lt;br /&gt;
&lt;br /&gt;
 Puis : &lt;br /&gt;
&lt;br /&gt;
 gcc -c tri_a_bulles.c&lt;br /&gt;
&lt;br /&gt;
 Jusque là, vous n&#039;êtes pas perdus, c&#039;est pareil ! Oui, mais, maintenant on génère la librairie dynamique : &lt;br /&gt;
&lt;br /&gt;
 gcc -o tri_a_bulles.so -shared tri_a_bulles.o&lt;br /&gt;
&lt;br /&gt;
 Puis on génère l&#039;exécutable en lui disant qu&#039;il fera appel à la librarie dynamique tri_a_bulles.so : &lt;br /&gt;
&lt;br /&gt;
 gcc -o test test.o tri_a_bulles.so&lt;br /&gt;
&lt;br /&gt;
 Puis content qu&#039;on est, on exécute : &lt;br /&gt;
&lt;br /&gt;
 ./test&lt;br /&gt;
 ./test: error in loading shared libraries:&lt;br /&gt;
 tri_a_bulles.so:&lt;br /&gt;
 cannot open shared object file:&lt;br /&gt;
 No such file or directory&lt;br /&gt;
&lt;br /&gt;
 Et oui, le bon des librairies partagées c&#039;est qu&#039;elles sont liées au moment de l&#039;exécution. Or, les librairies partagées, le système va les chercher dans un répertoire contenu dans la variable d&#039;environnement LD_LIBRARY_PATH. Et bien, par défaut le répertoire courant n&#039;en fait pas partie ... C&#039;est con ? &amp;lt;br /&amp;gt;&#039;&#039;&#039;Non&#039;&#039;&#039;, pas tant que ça ! Et il y a des outils, là encore pour faciliter les choses ... &amp;lt;br /&amp;gt;Tapez : &lt;br /&gt;
&lt;br /&gt;
 ldd ./test&lt;br /&gt;
 tri_a_bulles.so =&amp;gt; not found&lt;br /&gt;
 libc.so.6 =&amp;gt; /lib/libc.so.6 (0x4001a000)&lt;br /&gt;
 /lib/ld-linux.so.2 =&amp;gt; /lib/ld-linux.so.2 (0x40000000)&lt;br /&gt;
&lt;br /&gt;
 Visiblement, il y a une couille ! &amp;lt;br /&amp;gt; Alors, soit vous copiez votre librairie dans les répertoires qui contiennent des librairies dynamiques (/usr/lib, /usr/i486-linux-libc5/lib ou /usr/X11R6/lib chez moi), vous trouverez ça dans le fichier &#039;&#039;&#039;&#039;&#039;/etc/ld.so.conf&#039;&#039;&#039;&#039;&#039;. &amp;lt;br /&amp;gt;Ou alors ajouter votre répertoire à la variable en tapant &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Dans les deux cas, vous obtiendrez le résultat attendu en tapant : &lt;br /&gt;
&lt;br /&gt;
 ./test&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== En conclusion ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Avec les libraries statiques : ===&lt;br /&gt;
&lt;br /&gt;
* Vous fournissez l&#039;interface et maintenez le binaire. &lt;br /&gt;
* Vous pouvez apportez les modifications (à condition de respecter l&#039;interface) que vous voulez à la librarie MAIS : &lt;br /&gt;
* Toute modification de librairie nécessite une réédition de lien, d&#039;ou recompilation de l&#039;exécutable ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Avec les libraries dynamiques : ===&lt;br /&gt;
&lt;br /&gt;
* Vous fournissez l&#039;interface et maintenez le binaire. &lt;br /&gt;
* Vous pouvez apportez les modifications (à condition de respecter l&#039;interface) que vous voulez à la librarie. &lt;br /&gt;
* En cas de modification, vous n&#039;avez qu&#039;à remplacer l&#039;ancienne librairie par la nouvelle. &lt;br /&gt;
&lt;br /&gt;
=== Notons que : ===&lt;br /&gt;
&lt;br /&gt;
* L&#039;option &#039;&#039;-o nom&#039;&#039; sert à préciser le nom de l&#039;exécutable résultant, ici &#039;&#039;&#039;test&#039;&#039;&#039;. Sinon, on obtient un binaire exécutable &#039;&#039;&#039;a.out&#039;&#039;&#039;. &lt;br /&gt;
* L&#039;option &#039;&#039;-c&#039;&#039; sert à compiler sans édition de liens. &lt;br /&gt;
* Les extensions .a et .so n&#039;ont rien de formel. Si vous voulez, dans un élan nostalgique, utiliser .lib et .dll ou .bite et .cul, vous avez le droit, vous êtes libres, vous êtes sous linux ... &lt;br /&gt;
* Il est bon de taper dans sa console bien aimée : &amp;lt;code&amp;gt;man gcc&amp;lt;/code&amp;gt; &lt;br /&gt;
* Il est bon de taper dans sa console bien aimée : &amp;lt;code&amp;gt;man ar&amp;lt;/code&amp;gt; &lt;br /&gt;
* Il est bon de taper dans sa console bien aimée : &amp;lt;code&amp;gt;man ld&amp;lt;/code&amp;gt; &lt;br /&gt;
* ldd sert à connaître les dépendances dynamiques d&#039;un exécutable. &lt;br /&gt;
* On peut ajouter des chemins de recherche de librairies dynamiques dans la vairiable d&#039;environnement LD_LIBRARY_PATH ou dans le fichier /etc/ld.so.conf. &lt;br /&gt;
&lt;br /&gt;
=== Le résultat ===&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; bgcolor=&amp;quot;#fcfcd8&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#fcd8d8&amp;quot; | &#039;&#039;&#039;J&#039;allais oublier !!!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Normalement, le programme affiche un truc comme ça : &lt;br /&gt;
&lt;br /&gt;
 xavier@Rooty&lt;br /&gt;
 Rep: tabLong&lt;br /&gt;
 $ ./test&lt;br /&gt;
 tableau[0] = 1613489603&lt;br /&gt;
 tableau[1] = 866884903&lt;br /&gt;
 tableau[2] = 295298324&lt;br /&gt;
 tableau[3] = 1614953842&lt;br /&gt;
 tableau[4] = 1111079167&lt;br /&gt;
 tableau[5] = 950260573&lt;br /&gt;
 tableau[6] = 901366332&lt;br /&gt;
 tableau[7] = 745370511&lt;br /&gt;
 tableau[8] = 2063084132&lt;br /&gt;
 tableau[9] = 374329280&lt;br /&gt;
&lt;br /&gt;
 Taille du tableau : 10&lt;br /&gt;
&lt;br /&gt;
 Tableau après permutation des cases 2 et 8.&lt;br /&gt;
 tableau[0] = 1613489603&lt;br /&gt;
 tableau[1] = 866884903&lt;br /&gt;
 tableau[2] = 2063084132&lt;br /&gt;
 tableau[3] = 1614953842&lt;br /&gt;
 tableau[4] = 1111079167&lt;br /&gt;
 tableau[5] = 950260573&lt;br /&gt;
 tableau[6] = 901366332&lt;br /&gt;
 tableau[7] = 745370511&lt;br /&gt;
 tableau[8] = 295298324&lt;br /&gt;
 tableau[9] = 374329280&lt;br /&gt;
&lt;br /&gt;
 Tableau trié par la fonction de la librairie&lt;br /&gt;
 tableau[0] = 295298324&lt;br /&gt;
 tableau[1] = 374329280&lt;br /&gt;
 tableau[2] = 745370511&lt;br /&gt;
 tableau[3] = 866884903&lt;br /&gt;
 tableau[4] = 901366332&lt;br /&gt;
 tableau[5] = 950260573&lt;br /&gt;
 tableau[6] = 1111079167&lt;br /&gt;
 tableau[7] = 1613489603&lt;br /&gt;
 tableau[8] = 1614953842&lt;br /&gt;
 tableau[9] = 2063084132&lt;br /&gt;
&lt;br /&gt;
 En scoop, vous apprenez que mon pc s&#039;appelle Rooty (ce qui vient des &#039;&#039;Régulateurs&#039;&#039; de &#039;&#039;&#039;Bachman&#039;&#039;&#039;), que je me connecte sous le nom de xavier et que ce projet se trouve dans le répertoire tabLong. En outre le symbole &#039;&#039;&#039;$&#039;&#039;&#039; précise que je ne suis qu&#039;un simple utilisateur, le root ayant droit à un superbe &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;. Voilà !&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du renvoi sur la doc sur autoscan, autoconf, automake et leurs copains ce que j&#039;ai trouvé de plus sympa, ce sont les infos pages du gnome-help-browser. Si vous ne l&#039;avez pas installé, vous pouvez les consulter dans la console en tapant &amp;lt;code&amp;gt;info automake&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;info autoscan&amp;lt;/code&amp;gt;, etc ... !&lt;br /&gt;
&lt;br /&gt;
Pour trouver moults docs de developpement, voyez http://developer.gnome.org/. Il existe la même chose avec les libs kde sur http://developer.kde.org/. Il existe bien d&#039;autres sources d&#039;infos mais ce sont celles que je préfère.&lt;br /&gt;
&lt;br /&gt;
Un petit conseil, si vous aimez le c, installez les librairies gtk+/gdk/glib/imlib/ORBit C&#039;est le top. &amp;lt;br /&amp;gt;Vous cherchez un environnement de développement ? Choisissez gIDE et glade si vous avez des affinités avec le projet et les librairies du projet gnome ou kdevelop pour affinités avec KDE. &amp;lt;br /&amp;gt;Comme débogueur je dois dire que kdbg est génial, d&#039;autant qu&#039;il s&#039;intègre via DCOP dans kdevelop. Mais xemacs est pas mal non plus et gdb tout seul aussi, le tout c&#039;est de connaitre ! &amp;lt;br /&amp;gt;En bref, prenons ce qui existe de meilleur partout. Bienvenue dans linux et à bientôt pour de nouvelles aventures ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;merci&amp;quot;&amp;gt;Cette page est issue de la documentation &#039;pré-wiki&#039; de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Xavier GARREAU (alaide) le 03/01/2001.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 03/01/2001, Xavier GARREAU (alaide)&lt;br /&gt;
{{CC-BY-NC-SA}}&lt;/div&gt;</summary>
		<author><name>Basile S (phorum)</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Shell&amp;diff=12087</id>
		<title>Shell</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Shell&amp;diff=12087"/>
		<updated>2006-03-11T07:44:56Z</updated>

		<summary type="html">&lt;p&gt;Basile S (phorum) : /* Commandes pour débuter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Environnement système]]&lt;br /&gt;
= Le shell ou le retour du C:&amp;gt; ! (et les commandes) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;Le shell ou le retour du C:&amp;gt; ! &amp;lt;br /&amp;gt; (et les commandes)&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;par Jean-Christophe, [mailto:SPI.MJ%20%3Cspi.mj%20chez%20wanadoo.fr%3E Marc] et Anne&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;Le shell, un environnement écrit au temps ou les hommes étaient des hommes :-)&amp;lt;/div&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Qu&#039;est-ce que &#039;&#039;&#039;shell&#039;&#039;&#039; me direz vous ? Certains diront que c&#039;est ça le vrai Linux. il n&#039;y a pas que du faux là-dedans, puisque étymologiquement parlant, &amp;quot;Linux&amp;quot; est juste le nom du noyau du système d&#039;exploitation, et qu&#039;on a tendance par abus de langage à utiliser &amp;quot;Linux&amp;quot; pour désigner l&#039;ensemble de Linux, du serveur X et des nombreuses applications.&lt;br /&gt;
&lt;br /&gt;
Bref, le shell c&#039;est le bon vieux &#039;&#039;mode texte&#039;&#039;, mon copain le &#039;&#039;prompt&#039;&#039;, qui sous Linux revêt une importance capitale. En effet, la philosophie Unix veut que toute action puisse être réalisée en ligne de commande, avant d&#039;être accessible dans une boîte de dialogue. Ainsi de nombreuses applications X ne sont en fait que des &#039;&#039;front ends&#039;&#039; (des façades) à des applications en ligne de commande, se contentant de construire la bonne ligne de commande à partir de vos clics (XCDRoast / cdrecord, mkisofs, etc. ; kppp / pppd ; etc.).&lt;br /&gt;
&lt;br /&gt;
Comme Linux prône le règne de la liberté, vous n&#039;avez pas qu&#039;un seul &#039;&#039;shell&#039;&#039; disponible. Vous pouvez utiliser &#039;&#039;&#039;bash&#039;&#039;&#039;, &#039;&#039;&#039;tcsh&#039;&#039;&#039;, &#039;&#039;&#039;ksh&#039;&#039;&#039;, &#039;&#039;&#039;ash&#039;&#039;&#039;, &#039;&#039;&#039;sh&#039;&#039;&#039;, &#039;&#039;&#039;csh&#039;&#039;&#039;, etc. Néanmoins, la plupart des distributions actuelles proposent &#039;&#039;&#039;bash&#039;&#039;&#039; par défaut, et je vous recommande donc de l&#039;utiliser, surtout si vous débutez sous Unix et que vous n&#039;avez pas encore d&#039;habitudes. Si plus tard, vous tombez sur un ordinateur ne disposant que de tcsh, ne vous inquiétez pas : la différence n&#039;est pas flagrante, et vous pourrez toujours consulter &amp;quot;&amp;lt;code&amp;gt;man tcsh&amp;lt;/code&amp;gt;&amp;quot; ! &amp;lt;br /&amp;gt;&#039;&#039;à noter que le choix du shell pour un utilisateur se configure dans &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Le shell n&#039;est pas seulement le prompt vous permettant de taper vos commandes, c&#039;est aussi un puissant &#039;&#039;langage de commande&#039;&#039;, vous permettant d&#039;automatiser des tâches, etc. via l&#039;écriture de &#039;&#039;scripts shell&#039;&#039;. Apprendre le langage du shell peut être très enrichissant et utile ; néanmoins, cela dépasse le cadre de cette rubrique. Et pis j&#039;ai pas le courage de taper une leçon sur bash :) Par contre, vous trouverez ici les commandes de base, ainsi que les raccourcis clavier et les raccourcis du shell, les aliases, les variables d&#039;environnement, la configuration du shell et j&#039;en passe. C&#039;est déjà pas mal non ? &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Commandes pour débuter ==&lt;br /&gt;
&lt;br /&gt;
Avant de commencer, il faut savoir que Linux est &#039;&#039;&#039;sensible à la casse&#039;&#039;&#039; (&#039;&#039;case sensitive&#039;&#039; en anglais), c&#039;est à dire qu&#039;il distingue les majuscules des minuscules. Ainsi, si je vous dit que la commande est &#039;&amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt;&#039;, ce n&#039;est pas la peine d&#039;essayer &amp;lt;code&amp;gt;MKDIR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;mKdiR&amp;lt;/code&amp;gt;, cela ne fonctionnera pas. De même, les noms de fichiers et de répertoires sont également sensibles à la casse.&lt;br /&gt;
&lt;br /&gt;
De plus, sous Unix, les chemins sont séparés par des slash : écrivez &amp;lt;code&amp;gt;/etc/rc.d/init.d/xfs&amp;lt;/code&amp;gt; mais jamais &amp;lt;code&amp;gt;etc\rc.d\init.d\xfs&amp;lt;/code&amp;gt; par pitié :)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Répertoires spéciaux&#039;&#039;&#039; :&lt;br /&gt;
&amp;lt;code&amp;gt;.  &amp;lt;/code&amp;gt; représente le répertoire courant,&lt;br /&gt;
&amp;lt;code&amp;gt;.. &amp;lt;/code&amp;gt; représente le répertoire parent&lt;br /&gt;
&amp;lt;code&amp;gt;~ &amp;lt;/code&amp;gt; représente le répertoire maison (home) de l&#039;utilisateur&lt;br /&gt;
* &#039;&#039;&#039;Fichiers cachés&#039;&#039;&#039; :&lt;br /&gt;
sous Unix, les fichiers cachés commencent par un point. Par exemple, ~/.bashrc est un fichier caché, dans le répertoire maison de l&#039;utilisateur, qui contient la configuration de son shell.&lt;br /&gt;
* &#039;&#039;&#039;Jokers&#039;&#039;&#039; : ? et *&lt;br /&gt;
Les caractères &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; dans les noms de fichiers et de répertoires permettent de représenter des caractères quelconques. &#039;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&#039; représente un seul caractère, tandis que &#039;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&#039; en représente un nombre quelconque.&lt;br /&gt;
Par exemple &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;*.jpg&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; représente tous les fichiers se terminant par &amp;lt;code&amp;gt;jpg&amp;lt;/code&amp;gt; ; &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;*toto*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; tous les fichiers contenant &amp;quot;&amp;lt;code&amp;gt;toto&amp;lt;/code&amp;gt;&amp;quot;. Oui vous avez bien vu : on peut mettre plusieurs étoiles en même temps !!! Vous pouvez même faire : &amp;lt;code&amp;gt;cd /et*/rc.*/init*&amp;lt;/code&amp;gt;, cela risque de fonctionner !!!&lt;br /&gt;
Il faut également savoir que c&#039;est le shell qui interprète ces caractères avant de transmettre la ligne de commande. Par exemple, si vous tapez : &amp;lt;code&amp;gt;rm -Rf *.tmp&amp;lt;/code&amp;gt;, le shell transformera cette ligne de commande en : &amp;lt;code&amp;gt;rm truc1.tmp truc2.tmp truc3.tmp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Jokers avancés&#039;&#039;&#039; : []&lt;br /&gt;
Vous pouvez aussi utiliser les crochets pour spécifier des caractères :&lt;br /&gt;
&amp;lt;code&amp;gt;[a]&amp;lt;/code&amp;gt; signifie : égal à &#039;a&#039;. Exemple : &amp;lt;code&amp;gt;rm *[a]*&amp;lt;/code&amp;gt; efface tous les fichiers contenant la lettre &#039;a&#039;.&lt;br /&gt;
&amp;lt;code&amp;gt;[!a]&amp;lt;/code&amp;gt; signifie : différent de &#039;a&#039;. Exemple : &amp;lt;code&amp;gt;rm *[!a]*&amp;lt;/code&amp;gt; efface tous les fichiers, sauf ceux contenant la lettre &#039;a&#039;.&lt;br /&gt;
&amp;lt;code&amp;gt;[abc]&amp;lt;/code&amp;gt; signifie : l&#039;un des caractères a, b ou c. Exemple : &amp;lt;code&amp;gt;rm [abc]*.tmp&amp;lt;/code&amp;gt; efface tous les fichiers commençant par a, b ou c.&lt;br /&gt;
&amp;lt;code&amp;gt;[a-l]&amp;lt;/code&amp;gt; : signifie : tous les caractères compris entre a et l. Exemple : &amp;lt;code&amp;gt;rm fic_[a-l]*&amp;lt;/code&amp;gt; efface tous les fichiers commençant par &amp;lt;code&amp;gt;fic_&amp;lt;/code&amp;gt; suivi d&#039;une quelconque lettre entre a et l.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Bon c&#039;est pas tout ça, voici les commandes de base sous Linux :&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; |&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commandes linux&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; |&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
équivalent MsDos&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; |&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
à quoi ça sert&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
change le répertoire courant.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;cd ..&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - va dans le répertoire parent du répertoire courant&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd /home/user/.nsmail&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - va dans le répertoire désigné&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
affiche le contenu d&#039;un répertoire&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le contenu du répertoire courant&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le contenu du répertoire courant de manière détaillée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ls -a /home/user&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le contenu du répertoire désigné (ainsi que les fichiers cachés)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt;&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;&amp;lt;code&amp;gt;xcopy&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
copie un ou plusieurs fichiers&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;cp toto /tmp&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - copie le fichier toto dans le répertoire &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cp toto titi&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - copie le fichier &amp;lt;code&amp;gt;toto&amp;lt;/code&amp;gt; sur le fichier &amp;lt;code&amp;gt;titi&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cp -R /home/user /tmp/bak&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - copie le répertoire &amp;lt;code&amp;gt;/home/user&amp;lt;/code&amp;gt; ainsi que tout ce qu&#039;il contient dans &amp;lt;code&amp;gt;/tmp/bak&amp;lt;/code&amp;gt;&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;del&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
efface un ou plusieurs fichiers&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;rm toto titi&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - efface les fichiers &amp;lt;code&amp;gt;toto&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;titi&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm -f toto titi&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - efface les fichiers &amp;lt;code&amp;gt;toto&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;titi&amp;lt;/code&amp;gt; sans demander confirmation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;rm -rf&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;deltree&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
efface un répertoire et son contenu&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;rm -rf /tmp/*&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - efface (sans demander de confirmation) tous les fichiers et répertoire de &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;md&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
crée un répertoire&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;mkdir /home/user/mes_documents&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - crée le répertoire &amp;lt;code&amp;gt;mes_documents&amp;lt;/code&amp;gt; dans le sous répertoire &amp;lt;code&amp;gt;/home/user&amp;lt;/code&amp;gt; (ne pas mettre d&#039;espace dans les noms de fichier)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
efface un répertoire s&#039;il est vide&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;rmdir /home/user/.nsmail&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - efface le répertoire &amp;lt;code&amp;gt;.nsmail&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;/home/user&amp;lt;/code&amp;gt; si celui-ci est vide&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;ren&amp;lt;/code&amp;gt;&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;&amp;lt;code&amp;gt;move&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
déplace ou renomme  un ou des fichiers&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;mv tata titi&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - renomme tata en titi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mv * *.bak&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - ne fonctionne pas !!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mv * /tmp/bak&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - déplace tous les fichiers du répertoire courant vers le répertoire  &amp;lt;code&amp;gt;/tmp/bak&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dir -s&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
trouve un fichier répondant à certains critères&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;find /home -name &amp;quot;*bash*&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - trouve tous les fichiers contenant le mot &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; dans leur nom se trouvant dans le répertoire &amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;locate&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dir -s&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
trouve un fichier d&#039;après son nom&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;locate bash&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - trouve tous les fichiers contenant le mot &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; dans leur nom complet (avec le répertoire) : à la différence de &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;, locate trouve ses informations dans une base de donnée créée par &amp;lt;code&amp;gt;updatedb&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;help&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
affiche l&#039;aide concernant une commande particulière&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche l&#039;aide (page de &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;uel) de la commnade &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;. On quitte man en appuyant sur la touche &#039;&amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;chmod&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
pas &amp;lt;br /&amp;gt; d&#039;équivalent&lt;br /&gt;
|&lt;br /&gt;
modifie les permissions d&#039;un fichier&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;chmod o+r /home/user&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - autorise les autres (&amp;lt;code&amp;gt;o=other&amp;lt;/code&amp;gt;) (ie: ceux qui ne sont ni le propriétaire, ni membre du groupe propriétaire) à lire (&amp;lt;code&amp;gt;r=read&amp;lt;/code&amp;gt;) le répertoire &amp;lt;code&amp;gt;/home/user&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chmod a+rw /home/user/unfichier&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - autorise tout le monde (&amp;lt;code&amp;gt;a=all&amp;lt;/code&amp;gt;) à lire et écrire (&amp;lt;code&amp;gt;w=write&amp;lt;/code&amp;gt;) dans le fichier &amp;lt;code&amp;gt;/home/user/unfichier&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
pas &amp;lt;br /&amp;gt; d&#039;équivalent&lt;br /&gt;
|&lt;br /&gt;
modifie le propriétaire d&#039;un fichier&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;chown user unfichier&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     rend &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt; propriétaire de &amp;lt;code&amp;gt;unfichier&amp;lt;/code&amp;gt;.&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;chgrp&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
pas &amp;lt;br /&amp;gt; d&#039;équivalent&lt;br /&gt;
|&lt;br /&gt;
modifie le groupe proprétaire d&#039;un fichier&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;chgrp -R nobody /home/httpd&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - rend le groupe : &amp;lt;code&amp;gt;nobody&amp;lt;/code&amp;gt; (un groupe ayant très peu de droit sur un système linux) propriétaire de &amp;lt;code&amp;gt;/home/httpd&amp;lt;/code&amp;gt; ainsi que tout les fichiers qu&#039;il contient (&amp;lt;code&amp;gt;-R&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;ln -s&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
pas &amp;lt;br /&amp;gt; d&#039;équivalent&lt;br /&gt;
|&lt;br /&gt;
crée un lien vers un fichier&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;ln -s /dev/fd0 /dev/disquette&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     crée un lien vers &amp;lt;code&amp;gt;/dev/fd0&amp;lt;/code&amp;gt; (le lecteur de disquette) nommé &amp;lt;code&amp;gt;/dev/disquette&amp;lt;/code&amp;gt;. La manipulation de &amp;lt;code&amp;gt;/dev/fd0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;/dev/disquette&amp;lt;/code&amp;gt; (sauf l&#039;effacement).&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
pas &amp;lt;br /&amp;gt; d&#039;équivalent&lt;br /&gt;
|&lt;br /&gt;
recherche une chaine dans un fichier (en fait recherche une expression régulière dans plusieurs fichiers)&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;grep chaine *.txt&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - recherche la chaine &#039;&amp;lt;code&amp;gt;chaine&amp;lt;/code&amp;gt;&#039; dans tous les fichier se terminant par &amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;which&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
pas &amp;lt;br /&amp;gt; d&#039;équivalent&lt;br /&gt;
|&lt;br /&gt;
trouve le répertoire dans lequel se trouve une commande&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;which emacs&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - retourne le nom du répertoire dans lequel se trouve la commande &amp;lt;code&amp;gt;emacs&amp;lt;/code&amp;gt;.&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
affiche un fichier à l&#039;écran&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;cat ~/.bashrc&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le contenu du fichier &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarque&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt; Pour en savoir plus sur toutes ces commandes, je vous conseille de consulter leur page de man !&lt;br /&gt;
&lt;br /&gt;
=== La commande &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Cette commande est omniprésente, aussi il est bon d&#039;en présenter les basiques.&lt;br /&gt;
&lt;br /&gt;
Afficher le listing page par page : &amp;lt;code&amp;gt;ls | less&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;less&amp;lt;/code&amp;gt; est une version améliorée de &amp;lt;code&amp;gt;more&amp;lt;/code&amp;gt;) &amp;lt;br /&amp;gt; Afficher le listing en couleurs : &amp;lt;code&amp;gt;ls --color&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt; Afficher aussi les fichiers cachés (commençant par un point) : &amp;lt;code&amp;gt;ls -a&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt; Mettre un &#039;/&#039; après les noms de répertoires : &amp;lt;code&amp;gt;ls -p&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt; Afficher le listing détaillé : &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Tri sur la date&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt; Pour afficher les fichiers d&#039;un répertoire en triant sur la date de mise à jour des fichiers &amp;lt;br /&amp;gt; Afficher les fichiers les plus récents en premier : &amp;lt;code&amp;gt;ls -t&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt; Afficher les fichiers les plus vieux en premier : &amp;lt;code&amp;gt;ls -rt&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt; Mixer avec l&#039;option &amp;quot;l&amp;quot; afin d&#039;afficher le listing détaillé : &amp;lt;code&amp;gt;ls -rtl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;ls -tl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;bien sûr, toutes ces options sont mixables,&#039;&#039; ainsi &amp;quot;&amp;lt;code&amp;gt;ls -altp&amp;lt;/code&amp;gt;&amp;quot; affiche tous les fichiers, de façon détaillée, dans l&#039;ordre chronologique, an ajoutant &#039;/&#039; après chaque nom de répertoire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Exemple de listing&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[jice@taz jice]$&#039;&#039;&#039;ls -alp &amp;lt;br /&amp;gt;&amp;lt;font size=&amp;quot;-1&amp;quot;&amp;gt;total 144&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt; -rw-r--r--   1 jice  users     24 Aug  2 21:37 .bash_logout &amp;lt;br /&amp;gt; -rw-r--r--   1 jice  users    230 Aug  2 21:37 .bash_profile &amp;lt;br /&amp;gt; -rw-r--r--   1 jice  users    467 Aug  2 21:37 .bashrc &amp;lt;br /&amp;gt; -rw-r--r--   1 jice  users   1452 Aug  2 21:37 .kderc &amp;lt;br /&amp;gt; drwxr--r--  12 jice  users   1024 Aug  2 21:37 .kde/ &amp;lt;br /&amp;gt; drwxr--r--   2 jice  users   1024 Aug  2 21:37 Desktop/ &amp;lt;br /&amp;gt; -rw-r-----   1 jice  users   1728 Aug  2 21:37 adresses.txt &amp;lt;br /&amp;gt; -rw-------   1 jice  users    144 Aug  2 21:37 motsdepasse.txt &amp;lt;br /&amp;gt; lrwxrwxrwx   1 jice  users     14 Aug  2 21:37 linux -&amp;gt; /usr/src/linux&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication :&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt; La première ligne &amp;quot;total 144&amp;quot; est l&#039;espace disque utilisé par l&#039;ensemble des fichiers du répertoire.&lt;br /&gt;
&lt;br /&gt;
# La première colonne &amp;lt;code&amp;gt;-rw-r--r--&amp;lt;/code&amp;gt;représente les &#039;&#039;&#039;permissions&#039;&#039;&#039; associées au fichier. le premier caractère est un tiret pour un fichier, un d pour un répertoire, un l pour un lien, etc. &amp;lt;br /&amp;gt; ensuite, on a trois groupes de trois caractères : &amp;lt;code&amp;gt;rw-&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;r--&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; ou... &amp;lt;br /&amp;gt; Le premier groupe représente les permissions associées à l&#039;utilisateur (ici, jice), le deuxième celles associées à son groupe (ici : users), enfin le dernier est les permissions que tout le monde a sur ces fichiers. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; signifie : possibilité de lire ce fichier / dans ce répertoire, &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt; signifie : possibilité d&#039;écrire dans ce fichier / répertoire, &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; signifie : possibilité d&#039;exécuter ce fichier / d&#039;aller dans ce répertoire.&lt;br /&gt;
# nombre d&#039;inodes (partie élémentaire de [../docs/glossaire.php3#systeme_fichiers système de fichiers]) qui pointent vers le fichier/répertoire (généralement 1 pour un fichier, 2+le nombre de sous-répertoires pour un répertoire).&lt;br /&gt;
# utilisateur à qui appartient le fichier (jice)&lt;br /&gt;
# groupe auquel le fichier appartient (users)&lt;br /&gt;
# taille en octets&lt;br /&gt;
# date et heure de modification&lt;br /&gt;
# nom du fichier/répertoire.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Quelques questions et réponses ==&lt;br /&gt;
&lt;br /&gt;
Les commandes du tableau ci-dessus permettent de répondre à quelques questions comme : &amp;lt;br /&amp;gt; Où est cette commande (which) ? Que contient ce fichier (cat ou tac) ? Quel fichier contient tel mot (grep) ? etc. &amp;lt;br /&amp;gt; Voici  d&#039;autres questions et réponses qui ne nécessitent pas d&#039;être root et vous permettront de continuer à vous familiariser avec bash et ses commandes. Elles sont regroupées en trois tableaux : Informations sur les commandes ; informations sur le système ; informations sur les fichiers.&lt;br /&gt;
&lt;br /&gt;
=== Informations sur les commandes ===&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| width=&amp;quot;20%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Quelle commande utiliser pour faire ... ceci ou cela ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;apropos mot_clef&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;man -k mot_clef&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche les commandes, brièvement définies, en rapport avec mot_clef. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;apropos copier&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche les commandes en rapport avec la copie d&#039;un fichier, d&#039;une chaîne, d&#039;une zone mémoire ... &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;apropos permission&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche les commandes liées à la vérification et à la modification des permissions.&lt;br /&gt;
&lt;br /&gt;
Notes : les noms communs et les verbes à l&#039;infinitif permettent généralement de trouver facilement la commande recherchée. En cas d&#039;échec, pensez aux synonymes : apropos supprimer fait apparaître la commande rmdir (supprimer un répertoire), alors que apropos effacer fait apparaître la commande rm (effacer un fichier).&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Comment se définit cette commande ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;whatis nom_commande&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;man -f nom_commande&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche une brève définition de nom_commande. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;whatis whatis&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche la définition de whatis. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;whatis arch&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche la définition de la commande arch. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cd /bin ; for i in * ; do whatis $i ; done | more ; cd&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - se positionne dans le répertoire /bin/, affiche page par page la définition de chacune des commandes qui s&#039;y trouve, retourne au répertoire personnel.&lt;br /&gt;
&lt;br /&gt;
Notes : dans l&#039;exemple précédant vous pouvez bien sûr remplacer /bin par /sbin ; certaines entrées échouent.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Quelles sont et comment utiliser les commandes internes ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;help&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche la liste des commandes internes et leur syntaxe. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;help nom_commande&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche une aide sommaire sur nom_commande. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;help help&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;    - affiche une aide sur help. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;help alias&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche une aide sur la commande alias.&lt;br /&gt;
&lt;br /&gt;
Notes : ces commandes sont les commandes internes du shell, généralement le bash. Vous pouvez aussi en obtenir la liste en demandant à propos de l&#039;une d&#039;elles une page man qui n&#039;existe pas (man :). Vous trouverez également une aide sur les commandes internes dans la page man de bash (man bash). Enfin notez que help concerne les commandes internes mais --help les commandes externes.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;br /&amp;gt;&#039;&#039;&#039;Où sont et quelles sont les commandes externes ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;ls /bin&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le contenu du répertoire /bin/, et donc la liste des commandes externes usuelles communes à tous les utilisateurs. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;ls /sbin&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le contenu du répertoire /sbin/, et donc la liste des commandes externes usuelles réservées à l&#039;administrateur (root). &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;whereis nom_commande&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le chemin de nom_commande ainsi que celui de sa page man. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;whereis cat&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le chemin de la commande cat (/bin/cat) et celui de sa page man (/usr/share/man/man1/cat.1.bz2). &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;which nom_commande&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le chemin de nom_commande. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;which tac&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le chemin de tac (/usr/bin/tac).&lt;br /&gt;
&lt;br /&gt;
Notes : les répertoires /usr/bin/ et /usr/sbin/ contiennent les commandes externes moins fréquemment utilisées. Pour savoir si une commande est externe vous pouvez aussi simplement vérifier qu&#039;elle n&#039;est pas interne !&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Comment obtenir un aide mémoire sur cette commande ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;nom_commande --help&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche l&#039;aide mémoire de nom commande. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;ls --help&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche l&#039;aide mémoire de la commande ls.&lt;br /&gt;
&lt;br /&gt;
Notes : --help concerne la plupart des commandes externes et help les commandes internes. echo --help affiche bien sûr ... --help.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;La dernière commande s&#039;est-elle bien terminée ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;echo $?&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le code de retour de la dernière commande effectuée, 0 si elle s&#039;est bien terminée, un autre nombre dans le cas contraire. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;clear ; echo $?&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - efface l&#039;écran et affiche 0. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;sl / ; echo $?&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche un message d&#039;erreur et le code 127 (bash ne connaît pas la commande sl). &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;nom_commande 2&amp;gt;/dev/null &amp;amp;&amp;amp; echo &amp;quot;ok&amp;quot; || echo &amp;quot;m&#039;enfin&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - exécute nom_commande en redirigeant les erreurs vers /dev/null (périphérique fictif) puis affiche &amp;quot;ok&amp;quot; si tout s&#039;est bien passé ou &amp;quot;m&#039;enfin&amp;quot; dans le cas contraire. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;: &amp;amp;&amp;amp; echo &amp;quot;ok&amp;quot; || echo &amp;quot;m&#039;enfin&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - ne fait rien puis affiche &amp;quot;ok&amp;quot; (la commande : ne fait rien et se termine toujours bien). &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;bof 2&amp;gt;/dev/null &amp;amp;&amp;amp; echo &amp;quot;ok&amp;quot; || echo &amp;quot;m&#039;enfin&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche &amp;quot;m&#039;enfin&amp;quot; (la commande bof n&#039;existe pas).&lt;br /&gt;
&lt;br /&gt;
Notes : commande1 &amp;amp;&amp;amp; commande2 exécute commande2 que si commande1 s&#039;est terminée normalement (0) ; commande1 || commande2 exécute commande2 que si commande1 ne s&#039;est pas terminée correctement (&amp;lt;&amp;gt;0).&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;20%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Quels sont le nom, la taille et le contenu du fichier d&#039;historique ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;echo $HISTFILE $HISTFILESIZE&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le nom et la taille du fichier d&#039;historique des commandes. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cat $HISTFILE | more&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le contenu du fichier d&#039;historique page par page. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;tail -n 24 $HISTFILE&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche les 24 dernières lignes du fichier d&#039;historique.&lt;br /&gt;
&lt;br /&gt;
Notes : le fichier d&#039;historique vous aide à répondre à la question : mais comment j&#039;avais fait ? et à en conserver une trace d&#039;une connexion à l&#039;autre.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Quel est l&#039;historique actuel ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;history | more&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche page par page le contenu numéroté de l&#039;historique actuel des commandes. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;history 12&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche les 12 dernières entrées effectuées et leurs numéros.&lt;br /&gt;
&lt;br /&gt;
Notes : c&#039;est cet historique qui défile avec les touches &amp;quot;flèches&amp;quot; de votre clavier ; au démarrage, c&#039;est le contenu de votre fichier d&#039;historique.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Informations sur le système ===&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| width=&amp;quot;20%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Quel est le système ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;uname&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;echo $OSTYPE&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le nom du système d&#039;exploitation. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;uname -a&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche diverses informations système (nom du SE, version, microprocesseur ...). &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;arch&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;uname -m&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le type du microprocesseur. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cat /proc/cpuinfo&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche des informations sur le microprocesseur (type, fréquence, cache ...).&lt;br /&gt;
&lt;br /&gt;
Notes : les informations recueillies avec uname -a peuvent aussi être obtenues avec certaines variables système : echo $OSTYPE $BASH $BASH_VERSION etc.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Depuis combien de temps ce shell est-il actif ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;uptime&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche l&#039;heure, la durée d&#039;activité du système, le nombre d&#039;utilisateurs ... &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;echo $SECONDS&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche la durée d&#039;activité du shell courant en secondes. &amp;lt;br /&amp;gt; echo $[$SECONDS/3600] h $[($SECONDS%3600)/60] mn $[$SECONDS%60] s &amp;lt;br /&amp;gt;     - affiche cette durée en heures, minutes et secondes.&lt;br /&gt;
&lt;br /&gt;
Notes : bash ne connaît que les entiers et donc que les divisions euclidiennes, / permet d&#039;en obtenir le quotient et % d&#039;en obtenir le reste (ou modulo). Chaque fois que vous changez de terminal, ouvrez un nouvel xterm ou faites un su, celui-ci correspond à un nouveau (sous)shell, sa variable SECONDS est donc alors à 0. Pour savoir depuis combien de temps vous êtes sous Linux, revenez à votre console de login ; pour savoir depuis quand le système est actif, utilisez uptime.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Qu&#039;en est-il des disques, de la mémoire, du microprocesseur ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche la liste des disques montés. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;df -ah&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche au format humain l&#039;espace total, occupé, libre sur tous les disques. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;cat /proc/meminfo&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche des informations sur la mémoire (totale, libre,  swap ...). &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;vmstat&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche les statistiques sur la mémoire virtuelle. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche et permet d&#039;observer en temps réel l&#039;activité de la mémoire et du microprocesseur.&lt;br /&gt;
&lt;br /&gt;
Notes : la touche &amp;lt;Q&amp;gt; permet de quitter la commande top.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Quelles sont et que signifient les variables système ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;$&amp;lt;Tab&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche les noms des principales variables système. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;help variables | more&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche page par page la définition des principales variables système.&lt;br /&gt;
&lt;br /&gt;
Notes : les noms des variables système sont généralement écrits en majuscules. A chacune de ces variables correspond une question et une réponse, quelques unes seulement ont été formulées à divers endroits dans cette page.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Que contiennent ces variables système ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;echo $NOM_VARIABLE&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le contenu de NOM_VARIABLE. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;echo $USER&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le nom de l&#039;utilisateur en cours. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;echo $PS1&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche la chaîne de caractères définissant le prompt. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;printenv | more&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche page par page l&#039;environnement. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;set | more&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche page par page le contenu des principales variables système.&lt;br /&gt;
&lt;br /&gt;
Notes : vous pouvez bien sûr modifier le prompt PS1=&amp;quot;chaîne de caractères&amp;quot;. Pour rendre cette modification générale et durable, il faut utiliser le fichier /etc/bashrc (nécessite d&#039;être root).&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Qui suis-je et qui est ou était connecté au système ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;id nom_utilisateur&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche les identifications de nom_utilisateur. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche vos identifications : UID, GDI, groupes. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;who am i&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche vos coordonnées dans le système. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;who -H&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche avec une entête des informations (nom de login, console ... ) sur les utilisateurs connectés. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;w &amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche qui est connecté (who -H) et aussi ce qu&#039;il fait. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;last -n 12&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche la liste des 12 dernières connexions.&lt;br /&gt;
&lt;br /&gt;
Notes : la commande who am i ne fonctionne pas toujours sous xterm, dans ce cas entrez whoami mais vous n&#039;obtiendrez que votre nom de login. De nombreuses commandes permettent d&#039;obtenir une partie des renseignements évoqués ci-dessus, leurs noms parlent d&#039;eux-mêmes : logname, users, groups ...&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Quelles sont la date et l&#039;heure ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche la date et l&#039;heure. br /&amp;gt;&amp;lt;code&amp;gt;date +%x&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche seulement la date au format jj.mm.aaaa. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;date +%X&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche uniquement l&#039;heure au format hh:mm:ss. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cal&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche un calendrier du mois en cours. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cal 2000&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le calendrier de l&#039;an 2000, etc.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Y a-t-il un manchot dans le système ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;linux_logo&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche Tux et diverses informations système. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;linux_logo -la&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche Tux en ASCII et sans informations :-)&lt;br /&gt;
&lt;br /&gt;
Notes : sur mon système, linux_logo -la produit bien l&#039;affichage attendu (-a = ASCII et -l = pas d&#039;informations) mais  avec linux_logo -al, l&#039;option -l est ignorée et les informations sont affichées ... Y a-t-il un bug dans mon système ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Informations sur les fichiers ===&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| width=&amp;quot;20%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Quel est le répertoire courant ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le nom complet du répertoire en cours.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Quelle est la taille de ce répertoire ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;du -sh &amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche au format humain la taille du répertoire courant. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;du -h ~ | more&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche page par page au format humain la taille de votre répertoire personnel et de tous ses (sous)répertoires.&lt;br /&gt;
&lt;br /&gt;
Notes : du ne fonctionne que sur les répertoires où vous avez droit d&#039;accès, si nécessaire passez sous root.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Quel est le type de ce fichier ?&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;file nom_fichier&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le type de nom_fichier. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;file *&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche le type de tous les fichiers du répertoire en cours. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;file /bin&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche que /bin/ est un répertoire. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;file /bin/sh&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche que sh est un lien symbolique vers bash. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;file /bin/bash&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche que bash est un exécutable. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;file ~/.bashrc&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche que .bashrc de votre répertoire personnel est un fichier texte. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;file /dev/null&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;     - affiche que null est un fichier spécial.&lt;br /&gt;
&lt;br /&gt;
Notes : file sait reconnaître un grand nombre de types de fichiers parmi les fichiers spéciaux, exécutables, textes, données ... Il est préférable de l&#039;utiliser avant d&#039;entrer un &amp;quot;cat&amp;quot; au hasard.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Raccourcis ==&lt;br /&gt;
&lt;br /&gt;
=== Clavier ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tab&#039;&#039;&#039;&lt;br /&gt;
Taper une fois la touche [Tab] permet de compléter automatiquement un nom de fichier/répertoire s&#039;il est unique :&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; cd /et&#039;&#039;&#039;[Tab]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; cd /etc_&amp;lt;/div&amp;gt; &lt;br /&gt;
* &#039;&#039;&#039;Tab Tab&#039;&#039;&#039;&lt;br /&gt;
Si lors du premier appui sur [Tab], le nom n&#039;a pas été complété, un deuxième appui vous donne la liste de toues les possibilités :&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; cd /usr/doc/H&#039;&#039;&#039;[Tab][Tab]&#039;&#039;&#039;&amp;lt;br /&amp;gt; HTML    HOWTO&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; cd /usr/doc/H_&amp;lt;/div&amp;gt; &lt;br /&gt;
* &#039;&#039;&#039;Flèche vers le haut (ou Ctrl-P) / bas (ou Ctrl-N)&#039;&#039;&#039;&lt;br /&gt;
La flèche vers le haut permet de remonter dans l&#039;historique des commandes, la flèche vers le bas permet de revenir. Vous pouvez aussi utiliser la commande &amp;lt;code&amp;gt;fc&amp;lt;/code&amp;gt;, consultez &amp;lt;code&amp;gt;man fc&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Shift - flèche vers le haut/bas&#039;&#039;&#039;&lt;br /&gt;
Permet de scroller le contenu du terminal texte vers le haut ou le bas, d&#039;une ligne. En effet, les lignes qui ont défilé vers le haut restent en mémoire et restent accessibles. Terrible, non ?&lt;br /&gt;
* &#039;&#039;&#039;Shift - Page up/down&#039;&#039;&#039;&lt;br /&gt;
La même chose, mais page par page.&lt;br /&gt;
* &#039;&#039;&#039;Ctrl-C&#039;&#039;&#039;&lt;br /&gt;
Arrête le processus en cours, celui qui a été lancé par la dernière commande.&lt;br /&gt;
* &#039;&#039;&#039;Ctrl-Z&#039;&#039;&#039;&lt;br /&gt;
Stoppe le processus en cours, celui qui a été lancé par la dernière commande, mais ne le détruit pas : il reste en attente. Pour le mettre en tâche de fond (il continue à s&#039;exécuter, mais vous pouvez continuer à taper des commandes), tapez &#039;&#039;&#039;&amp;lt;code&amp;gt;bg&amp;lt;/code&amp;gt;&#039;&#039;&#039;. Pour le faire revenir en avant, taper &#039;&#039;&#039;&amp;lt;code&amp;gt;fg&amp;lt;/code&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Ctrl-D&#039;&#039;&#039;&lt;br /&gt;
Ferme le terminal en cours (similaire à &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
et aussi...&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ctrl-Alt-Fn&#039;&#039;&#039;&lt;br /&gt;
Se place sur la console virtuelle numéro &#039;&#039;&#039;n&#039;&#039;&#039;. Par défaut, il y a en général 6 consoles texte virtuelles, de F1 à F6, et X Window se lance dans la septième (F7).&lt;br /&gt;
* &#039;&#039;&#039;Ctrl-Alt-Backspace&#039;&#039;&#039;&lt;br /&gt;
Cela permet de tuer X et de revenir soit à la [../docs/glossaire.php3#display_manager bannière de login] soit au shell qui a lancé X par &amp;lt;code&amp;gt;startx&amp;lt;/code&amp;gt;. A éviter si possible : il est plus sain de quitter X en se déconnectant proprement.&lt;br /&gt;
* &#039;&#039;&#039;Ctrl-Alt-Del&#039;&#039;&#039;&lt;br /&gt;
Suivant votre configuration, ces touches à l&#039;action bien connue vous permettrons de rebooter votre ordinateur (synonyme de &amp;lt;code&amp;gt;reboot&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;shutdown -r now&amp;lt;/code&amp;gt;). Si vous souhaitez juste arrêter votre ordinateur afin de l&#039;éteindre, tapez &amp;lt;code&amp;gt;halt&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;shutdown -h now&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Shell ===&lt;br /&gt;
&lt;br /&gt;
Les shells Unix disposent de petits &amp;quot;raccourcis&amp;quot; très astucieux et utiles, qui vous épargnerons de taper sur quelques touches. Ne dit-on pas qu&#039;un bon informaticien est un informaticien fainéant ? :-)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dernière ligne de commande : &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On a vu plus haut qu&#039;elle était accessible par la flèche vers le haut, mais vous pouvez également la désigner par &#039;&amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;&#039;, ce qui peut être très intéressant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; vi&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; which !!&amp;lt;br /&amp;gt; which vi&amp;lt;br /&amp;gt; /bin/vi&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arguments de la dernière commande : &amp;lt;code&amp;gt;!*&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Les arguments de la dernière commande peuvent être représentés par &#039;&amp;lt;code&amp;gt;!*&amp;lt;/code&amp;gt;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; mkdir test&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; cd !&amp;lt;br /&amp;gt; cd test&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utiliser la sortie d&#039;une commande comme argument :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez réutiliser directement ce qu&#039;une commande écrit à l&#039;écran comme argument pour une autre commande. Pour ce faire, vous devez encadrer la commande par une cote inverse &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt; ou la mettre entre parenthèses précédées du signe $ ; elle sera remplacée par ce qu&#039;elle écrit à l&#039;écran dans la ligne de commande. Imaginez par exemple que vous vouliez voir les informations sur le fichier exécutable de emacs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; ls -l `which emacs`&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; ls -l $(which emacs)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
est ainsi équivalent à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; which emacs&amp;lt;br /&amp;gt; /usr/bin/emacs&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; ls -l /usr/bin/emacs&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cool non ? Et vous pouvez mixer les raccourcis vus précédemment :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; emacs&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; ls -l `which !!`&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C&#039;est-y pas beau ça madame ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remplacer un caractère par un autre : &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez remplacer la première occurrence d&#039;un caractère de la ligne de commande précédente par un autre, vous pouvez utiliser le symbole &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;, comme ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; lpcate i486-linux-libc5&amp;lt;br /&amp;gt; lpcate : command not found&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; ^p^o&amp;lt;br /&amp;gt; locate i486-linux-libc5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;^p^o&amp;lt;/code&amp;gt; signifie : refait la même ligne de commande que précédemment, mais remplace le premier p par un o.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lancer un programme directement en tâche de fond : &amp;amp;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Il suffit de faire suivre la ligne de commande du symbole &amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; cp -R /usr/doc /tmp &amp;amp;&amp;lt;br /&amp;gt; [1] 7194&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; _&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande est lancée en tâche de fond, c&#039;est à dire qu&#039;elle s&#039;exécute, mais la main vous est rendue tout de suite. La fin de la commande est signifiée par un message :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039;&amp;lt;br /&amp;gt; [1]+ Done cp -R /usr/doc /tmp&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; _ &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lancer plusieurs programmes en même temps : &amp;amp;, &amp;amp;&amp;amp;, &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Vous avez plusieurs solutions :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;prog1 ; prog2 &amp;lt;/code&amp;gt; lance prog1, puis prog2,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;prog1 &amp;amp; prog2 &amp;lt;/code&amp;gt; lance prog1 en arrière plan, puis immédiatement prog2 en avant plan,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;prog1 &amp;amp;&amp;amp; prog2&amp;lt;/code&amp;gt; lance prog1, puis prog2 seulement si prog1 n&#039;a pas retourné d&#039;erreur,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;prog1 || prog2&amp;lt;/code&amp;gt; lance prog1, puis prog2 seulement si prog1 A retourné une erreur.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Redirections ==&lt;br /&gt;
&lt;br /&gt;
Normalement, la sortie des programmes se fait à l&#039;écran, aussi bien pour les erreurs (&#039;&#039;standard error&#039;&#039;) que pour les messages &amp;quot;normaux&amp;quot; (&#039;&#039;standard output&#039;&#039;). Vous pouvez la rediriger, soit vers un fichier avec &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;, soit vers l&#039;entrée d&#039;un autre programme avec &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; (ou pipe - attention, arrêtez de rigoler dans le fond :-).&lt;br /&gt;
&lt;br /&gt;
De même, l&#039;entrée standard (&#039;&#039;standard input&#039;&#039;) est habituellement constituée du clavier, mais on peut aussi la remplacer par le contenu d&#039;un fichier, avec le symbole &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Envoyer la sortie standard d&#039;un programme dans l&#039;entrée standard d&#039;un autre ===&lt;br /&gt;
&lt;br /&gt;
Vous avez déjà certainement vu ou utilisé une commande du type :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; ls -la &#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;|&amp;lt;/font&amp;gt;&#039;&#039;&#039; more&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ls -la&amp;lt;/code&amp;gt; envoie la version longue du listing de répertoire, avec les fichier cachés, à &amp;lt;code&amp;gt;more&amp;lt;/code&amp;gt; qui l&#039;affiche page par page. &amp;lt;br /&amp;gt; Vous pouvez aussi enchaîner plusieurs redirections :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; cat /var/log/messages &#039;&#039;&#039;|&#039;&#039;&#039; grep gpm &#039;&#039;&#039;|&#039;&#039;&#039; more&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ceci va afficher page par page l&#039;ensemble des messages système relatifs à &amp;lt;code&amp;gt;gpm&amp;lt;/code&amp;gt;. (voir plus haut ce que font chacune de ces commandes).&lt;br /&gt;
&lt;br /&gt;
=== Envoi d&#039;un fichier dans l&#039;entrée standard ===&lt;br /&gt;
&lt;br /&gt;
L&#039;entrée standard (&#039;&#039;standard input&#039;&#039;) est normalement ce que vous tapez au clavier. Vous pouvez remplacer vos frappes clavier par le contenu d&#039;un fichier, qui sera ouvert et envoyé sur l&#039;entrée standard du programme. C&#039;est pratique pour automatiser des tâches avec des programmes interactifs. Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; ftp &amp;lt; sessiontype.txt &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici le fichier &amp;lt;code&amp;gt;sessiontype.txt&amp;lt;/code&amp;gt; pourra contenir par exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; open ftp.lesite.com&amp;lt;br /&amp;gt;  user jice&amp;lt;br /&amp;gt;  pass xxxxxx&amp;lt;br /&amp;gt;  cd /pub/linux/doc&amp;lt;br /&amp;gt;  bin&amp;lt;br /&amp;gt;  get jice.jpg&amp;lt;br /&amp;gt;  bye&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et vous permettra en une seule commande de récupérer le fichier &amp;lt;code&amp;gt;jice.jpg&amp;lt;/code&amp;gt; sur le site &amp;lt;code&amp;gt;ftp.lesite.com&amp;lt;/code&amp;gt; (utile si ce fichier change et que vous voulez le mettre à jour régulièrement). Bref, à vous d&#039;inventer la vie qui va avec :-)&lt;br /&gt;
&lt;br /&gt;
=== Redirection des sorties vers un fichier ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; ls -lR /cdrom &#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt;&#039;&#039;&#039; cdrom.txt&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande va lister le contenu du cdrom, et enregistrer le résultat dans le fichier &amp;lt;code&amp;gt;cdrom.txt&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; En mettant deux &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; de suite, vous ajoutez au fichier :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; date &#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt;&#039;&#039;&#039; cdrom.txt&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ceci va ajouter la date au fichier précédemment créé.&lt;br /&gt;
&lt;br /&gt;
Les messages d&#039;erreur peuvent être dirigés séparément dans un fichier avec &#039;&#039;&#039;&amp;lt;code&amp;gt;2&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; startx &amp;gt; startx.log &#039;&#039;&#039;2&amp;gt;&#039;&#039;&#039; startx.err&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou dirigés vers le même fichier que les messages normaux :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; startx &amp;gt; startx.log &#039;&#039;&#039;2&amp;gt;&amp;amp;1&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Gestion des processus ==&lt;br /&gt;
&lt;br /&gt;
Linux est &#039;&#039;multitâches&#039;&#039;, ce qui signifie que plusieurs programmes (qui peuvent être à la fois des applications utilisateur ou des tâches système) peuvent tourner simultanément. On vient de voir qu&#039;on pouvait lancer directement depuis un terminal texte une commande en tâche de fond, avec le symbole &amp;amp;. &amp;lt;br /&amp;gt; Comment gère-t-on ensuite ces processus ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lister les processus : &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La liste des processus en cours pour un terminal donné s&#039;obtient en tapant simplement la commande &#039;&#039;&#039;&amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt;&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; PID TTY STAT TIME COMMAND&amp;lt;br /&amp;gt;   12  p1 S    0:00 bash&amp;lt;br /&amp;gt;  144  p1 S    0:01 emacs&amp;lt;br /&amp;gt; 1768  p1 R    0:00 ps&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous voulez voir plus de processus, vous pouvez lister tous les processus d&#039;un utilisateur par &amp;lt;code&amp;gt;ps U root&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;   PID TTY      STAT   TIME COMMAND&amp;lt;br /&amp;gt;     1 ?        S      0:04 init&amp;lt;br /&amp;gt;     2 ?        SW     0:00 [keventd]&amp;lt;br /&amp;gt;     3 ?        SWN    0:00 [ksoftirqd_CPU0]&amp;lt;br /&amp;gt; ...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi voir l&#039;ensemble des process d&#039;un système par &amp;lt;code&amp;gt;ps aux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lister les jobs et les gérer : &amp;lt;code&amp;gt;jobs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bg&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;job&amp;quot; est un mot qui désigne ici les programmes que vous avez lancé en arrière plan (tâche de fond) dans votre terminal. Pour lancer un job en arrière plan, vous pouvez :&lt;br /&gt;
&lt;br /&gt;
lancer le programme par son nom, puis taper &amp;lt;span class=&amp;quot;key&amp;quot;&amp;gt;Ctrl-Z&amp;lt;/span&amp;gt; pour le stopper, puis la commande &#039;&#039;&#039;&amp;lt;code&amp;gt;bg&amp;lt;/code&amp;gt;&#039;&#039;&#039; pour l&#039;envoyer en arrière plan (BackGround).&lt;br /&gt;
&lt;br /&gt;
vous pouvez aussi simplement taper le nom de ce programme suivi par le symbole &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;afficher une liste des jobs d&#039;un terminal, tapez la commande &#039;&#039;&#039;&amp;lt;code&amp;gt;jobs&amp;lt;/code&amp;gt;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; find / -name &amp;quot;*a*&amp;quot; &amp;gt;A &amp;amp;&amp;lt;br /&amp;gt; [1] 7859&amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; jobs&amp;lt;br /&amp;gt; [1]+ Running find / -name &amp;quot;*a*&amp;quot; &amp;gt;A &amp;amp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour chacun de ces jobs, vous pouvez les faire revenir en avant plan avec la commande &#039;&#039;&#039;&amp;lt;code&amp;gt;fg&amp;lt;/code&amp;gt;&#039;&#039;&#039; ; &amp;quot;&amp;lt;code&amp;gt;fg&amp;lt;/code&amp;gt;&amp;quot; pour le dernier programme lancé en tâche de fond, &amp;quot;&amp;lt;code&amp;gt;fg %n&amp;lt;/code&amp;gt;&amp;quot; pour le n&amp;lt;sup&amp;gt;ième&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuer un processus : &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;killall&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de terminer un processus qui ne répond plus, par exemple, on utilise la commande &#039;&#039;&#039;&amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt;&#039;&#039;&#039;, suivie du numéro de job (&amp;lt;code&amp;gt;%n&amp;lt;/code&amp;gt;) ou du PID du programme à tuer. Par exemple, si &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; donne le résultat ci-dessus, la commande &amp;quot;&amp;lt;code&amp;gt;kill 144&amp;lt;/code&amp;gt;&amp;quot; arrêtera la tâche emacs. &amp;quot;&amp;lt;code&amp;gt;kill %1&amp;lt;/code&amp;gt;&amp;quot; fera la même chose.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également tuer des processus par leur nom avec la commande &#039;&#039;&#039;&amp;lt;code&amp;gt;killall&amp;lt;/code&amp;gt;&#039;&#039;&#039; suivie du nom du processus à tuer, mais attention : TOUS les processus de l&#039;utilisateur utilisant killall et portant le même nom seront tués. Par exemple, si vous tapez &amp;quot;&amp;lt;code&amp;gt;killall emacs&amp;lt;/code&amp;gt;&amp;quot;, non seulement la fenêtre emacs lancée depuis ce terminal sera supprimée, mais aussi tous les autres emacs lancés depuis un autre terminal par l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi passer un autre argument à kill et killall, qui est le &#039;&#039;signal&#039;&#039; à envoyer à la tâche (les &#039;&#039;signaux&#039;&#039; sont une manière de communiquer avec les applications sous Unix). Par exemple, si la tâche récalcitrante ne s&#039;arrête pas avec un simple &amp;lt;code&amp;gt;kill 144&amp;lt;/code&amp;gt;, essayez &amp;lt;code&amp;gt;kill -9 144&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;kill -QUIT 144&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Aliases et variables d&#039;environnement ==&lt;br /&gt;
&lt;br /&gt;
=== Aliases ===&lt;br /&gt;
&lt;br /&gt;
Plutôt que de taper de longues commandes, ou bien parce que vous préférez vous rappeler d&#039;un nom plutôt que du vrai nom Unix, vous pouvez définir des &#039;&#039;aliases&#039;&#039;. Pour ce faire, utilisez la commande &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; comme suit :&lt;br /&gt;
&lt;br /&gt;
Si votre shell est &#039;&#039;&#039;bash&#039;&#039;&#039; ou sh ou ash (par défaut) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;alias md=mkdir &amp;lt;br /&amp;gt; alias ls=&#039;ls --color&#039; &amp;lt;br /&amp;gt; alias eclip2=&#039;telnet eclip2.ec-lille.fr&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si votre shell est &#039;&#039;&#039;tcsh&#039;&#039;&#039; ou csh (par défaut) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;alias md mkdir &amp;lt;br /&amp;gt; alias ls &#039;ls --color&#039; &amp;lt;br /&amp;gt; alias eclip2 &#039;telnet eclip2.ec-lille.fr&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi pourrez-vous taper &amp;lt;code&amp;gt;md&amp;lt;/code&amp;gt; au lieu de &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;eclip2&amp;lt;/code&amp;gt; pour vous connecter à cette machine via telnet ; la commande &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; affichera une sortie en couleurs...&lt;br /&gt;
&lt;br /&gt;
Le problème est que les aliases définis dans un terminal ne sont valables que dans celui-ci, et disparaîtrons à jamais dès que ce terminal sera fermé. Pour conserver des alias par-delà les connexions/déconnexions, regardez la [#configuration_shell configuration du shell] : vous pouvez définir vos aliases dans le fichier &#039;&#039;&#039;~/.bashrc&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Variables d&#039;environnement, Path et Prompt ===&lt;br /&gt;
&lt;br /&gt;
Les variables d&#039;environnement servent à enregistrer des paramètres que les programmes peuvent lire ensuite. Elles sont désignées par un symbole &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; suivi de lettres, chiffres et symboles.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la variable &amp;lt;code&amp;gt;$HOME&amp;lt;/code&amp;gt; est égale au répertoire maison de l&#039;utilisateur en cours (en général &amp;lt;code&amp;gt;/home/user&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
De même, la variable &amp;lt;code&amp;gt;$PATH&amp;lt;/code&amp;gt; représente le chemin de recherche que le shell va parcourir afin de trouver le fichier exécutable qui correspond à la commande que vous venez de taper. Par exemple, &amp;lt;code&amp;gt;$PATH = /bin:/usr/bin:/usr/local/bin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Créer ou modifier une variable d&#039;environnement&#039;&#039;&#039;&amp;lt;br /&amp;gt; Si votre shell est &#039;&#039;&#039;bash&#039;&#039;&#039; ou sh ou ash (par défaut) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;export MAVARIABLE=mavaleur&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si votre shell est &#039;&#039;&#039;tcsh&#039;&#039;&#039; ou csh (par défaut) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;setenv MAVARIABLE mavaleur&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande positionnera la variable &amp;lt;code&amp;gt;MAVARIABLE&amp;lt;/code&amp;gt; à la valeur &amp;lt;code&amp;gt;mavaleur&amp;lt;/code&amp;gt;. Vous pouvez le vérifier, en tapant la commande &amp;lt;code&amp;gt;echo $MAVARIABLE&amp;lt;/code&amp;gt; qui écrira à l&#039;écran &amp;quot;&amp;lt;code&amp;gt;mavaleur&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi ajouter le chemin &amp;lt;code&amp;gt;/home/user/bin&amp;lt;/code&amp;gt; à votre &amp;lt;code&amp;gt;$PATH&amp;lt;/code&amp;gt; si vous installez des logiciels dans votre répertoire personnel par exemple. Sous bash, cela donnera : export &amp;lt;code&amp;gt;PATH=$PATH:/home/user/bin&amp;lt;/code&amp;gt;. Cependant, de même que pour les aliases, ce nouveau PATH sera perdu dès votre déconnexion...&lt;br /&gt;
&lt;br /&gt;
Attention, en général, le répertoire courant &#039;&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&#039; ne fait pas partie du PATH pour des raisons de sécurité : imaginez qu&#039;une personne mal intentionnée aie mis un programme destructeur appelé &amp;quot;&amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;&amp;quot; dans votre répertoire, vous le lanceriez dès que vous taperiez la commande &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; ! C&#039;est pourquoi il faut toujours faire précéder de son chemin complet une commande qui n&#039;est pas dans le PATH, et ce même si vous êtes dans le même répertoire que la commande ! Ainsi,  il ne faut pas taper &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt;, mais &amp;lt;code&amp;gt;./configure&amp;lt;/code&amp;gt; (programme classique à lancer avant compilation d&#039;un logiciel), ce qui signifie : lance le programme &#039;&amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt;&#039; qui est présent dans le répertoire courant.&lt;br /&gt;
&lt;br /&gt;
Le &#039;&#039;&#039;prompt&#039;&#039;&#039; est également contenu dans une variable d&#039;environnement : &amp;lt;code&amp;gt;PS1&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt; Le prompt par défaut de la Mandrake par exemple, &amp;lt;code&amp;gt;[user@localhost user]$&amp;lt;/code&amp;gt;, est défini comme suit : &amp;lt;code&amp;gt;PS1=&amp;quot;[u@h W]$ &amp;quot;&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; est l&#039;utilisateur, &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; le nom de machine (hostname), &amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt; le chemin courant (ex : &amp;lt;code&amp;gt;/usr/doc&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; le répertoire courant (ex : &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;)... voyez &amp;lt;code&amp;gt;man bash&amp;lt;/code&amp;gt; pour l&#039;ensemble des possibilités.&lt;br /&gt;
&lt;br /&gt;
Une autre variable d&#039;environnement utile : PROMPT_COMMAND. Cette variable contient une commande qui est exécutée à chaque fois que le prompt est affiché. Cela permet des tas de fantaisies rigolotes, comme par exemple de jouer un son (trop utile :-) ou de positionner le titre d&#039;un xterm avec le nom du répertoire courant (voir &amp;lt;code&amp;gt;man xterm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Regardez la [#configuration_shell configuration du shell] : vous pouvez définir vos variables dans le fichier &amp;lt;code&amp;gt;~/.bash_profile&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Configuration du shell ==&lt;br /&gt;
&lt;br /&gt;
Vous pouvez enregistrer des fichiers qui seront lus et exécutés par votre shell, lors de l&#039;ouverture d&#039;un terminal, aussi bien que lors de sa fermeture. Cela va vous permettre d&#039;y placer vos aliases préférés, et vos variables d&#039;environnement.&lt;br /&gt;
&lt;br /&gt;
Pour &#039;&#039;&#039;bash&#039;&#039;&#039; et consorts, ces fichiers s&#039;appellent : &amp;lt;code&amp;gt;.bashrc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.bash_profile&amp;lt;/code&amp;gt; pour la connexion et &amp;lt;code&amp;gt;.bash_logout&amp;lt;/code&amp;gt; pour la déconnexion. &amp;lt;br /&amp;gt; Pour &#039;&#039;&#039;tcsh&#039;&#039;&#039; et ses potes, ces fichiers s&#039;appellent : &amp;lt;code&amp;gt;.tcshrc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.login&amp;lt;/code&amp;gt; pour la connexion et &amp;lt;code&amp;gt;.logout&amp;lt;/code&amp;gt; pour la déconnexion. &amp;lt;br /&amp;gt; Ces fichiers se situent tous dans le répertoire maison de l&#039;utilisateur ($HOME). Notez bien qu&#039;ils commencent par un point : ce sont des fichiers cachés. Pour les voir, il faut faire un &amp;quot;&amp;lt;code&amp;gt;ls -a&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Examinez les avec votre éditeur de texte préféré, et vous verrez comment ajouter de nouveaux aliases et variables d&#039;environnement, ainsi que lancer tel ou tel programme automatiquement : en tant que &#039;&#039;scripts shell&#039;&#039;, ces programmes sont en fait une suite d&#039;instructions qui sera interprétée par le shell. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Les entrailles du shell ==&lt;br /&gt;
&lt;br /&gt;
Vous êtes maintenant munis d&#039;une jolie batterie d&#039;outils qui va entre autres vous permettre d&#039;écrire tous vos scripts shell. Toutefois même en ayant récupéré la synthaxe de commandes vous continuez à subir des erreurs... Soit la commande ne vous retourne pas le résultat attendu soit le shell vous retourne des erreurs... &amp;lt;br /&amp;gt; Ne vous êtes vous jamais posé cette question : est-ce que je mets des simples quotes, des doubles quotes ou des back quotes ? &amp;lt;br /&amp;gt; Pour ne plus avoir à se poser ce genre de questions, il est essentiel de bien connaitre le fonctionnement interne du shell.&lt;br /&gt;
&lt;br /&gt;
=== Les grandes étapes de l&#039;interprétation d&#039;une ligne de commandes ===&lt;br /&gt;
&lt;br /&gt;
Pour mieux comprendre le résultat obtenu, il faut savoir que le shell lit plusieurs fois la ligne avant d&#039;exécuter la commande. &amp;lt;br /&amp;gt; Cette lecture se fait dans l&#039;ordre suivant :&lt;br /&gt;
&lt;br /&gt;
# substition de variables : le shell remplace les variables par leurs valeurs&lt;br /&gt;
# substitution de commandes : le shell remplace une variable par son contenu qui est le résultat d&#039;une commande&lt;br /&gt;
# interprétation des pipes et des redirections&lt;br /&gt;
# expansion des noms de fichiers : interprétation des caractères spéciaux pour compléter un nom de fichier et/ou de répertoire&lt;br /&gt;
# exécution de la commande&lt;br /&gt;
&lt;br /&gt;
On se rend donc compte qu&#039;un caractère spécial peut être interprété par le shell avant d&#039;être interprété au sein de la commande.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple&#039;&#039;&#039; : le caractère &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; peut être interprété par le shell (remplace 0 ou n caractères pour compléter un nom de fichier) ou par une commande comme &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; (répète de 0 à n fois le caractère précédent dans une chaîne de caractères). Toutefois, sans précision dans la synthaxe, et selon les étapes ci-dessus, le caractère sera d&#039;abord interprété par le shell. D&#039;où quelques surprises dans le résultat de la commande.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;interprétation des caractères spéciaux ===&lt;br /&gt;
&lt;br /&gt;
Pour choisir de faire interpréter les caractères spéciaux par le shell ou la commande, il existe 3 possibilités :&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;utilisation des doubles quotes&#039;&#039;&#039; (ou guillemets en bon français) : lorsque la chaîne de caractères est écrite entre guillemets, tous les caractères spéciaux perdent leur signification &#039;&#039;&#039;sauf&#039;&#039;&#039; : &#039;&#039;&#039;$ \&#039;&#039;&#039; et &#039;&#039;&#039;``&#039;&#039;&#039; (simples quotes).&lt;br /&gt;
exemple :&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; echo * &amp;lt;br /&amp;gt; bidule fic1 fic2 truc&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039; est un caractère spécial non protégé. Au premier passage du shell, il est donc interprété. Il signifie alors l&#039;ensemble des fichiers du répertoire courant&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; echo &amp;quot;*&amp;quot; &amp;lt;br /&amp;gt; * &amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039; est protégé par les guillemets. Il n&#039;est donc pas interprété par le shell comme caractère spécial et devient un caractère pour la commande echo. Dans le cadre de cette commande, * n&#039;a aucune signification particulière, il est donc affiché à l&#039;écran tel que.&lt;br /&gt;
* &#039;&#039;&#039;utilisation des simples quotes&#039;&#039;&#039; : lorsque la chaîne de caractères est écrite entre simples quotes, tous les caractères spéciaux sans exception perdent leur signification pour le shell. Ils seront donc éventuellement interprété par la commande passée.&lt;br /&gt;
exemple : recherche des lignes d&#039;un script utilisant la variable PATH&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; grep $PATH /home/user/script &amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
Au premier passage, le shell interprète le &#039;&#039;&#039;$&#039;&#039;&#039; comme introduisant une variable. Il remplace donc la variable par son contenu puis exécute la commande &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;. Il ne trouve donc aucune ligne comportant les chemins référencés dans PATH.&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; grep &#039;$PATH&#039; /home/user/script &amp;lt;br /&amp;gt; echo $PATH &amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
Le shell n&#039;interprète pas le &#039;&#039;&#039;$&#039;&#039;&#039; lors du premier passage car sa signification est annulée par les simples quotes. le $ est donc traité par la commande grep. Comme il n&#039;a pas de signification particulière, il est interprété comme un caractère quelconque.&lt;br /&gt;
* annulation d&#039;un caractère spécial avec \ : pour empêcher le shell d&#039;interpréter un caractère spécial, il suffit de positionner un anti-slash devant le caractère spécial donné.&lt;br /&gt;
exemple : pour reprendre l&#039;exemple précédent on aurait pu écrire aussi :&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; grep \$PATH /home/user/script &amp;lt;br /&amp;gt; echo $PATH &amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Liste des caractères spéciaux ===&lt;br /&gt;
&lt;br /&gt;
Ci-dessous la liste des caractères spéciaux du shell :&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;75%&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;&amp;amp;&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
processus en arrière-plan&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;~&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
home directory&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
séparateur de commandes&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;\&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
annulation d&#039;un caractère spécial&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
doubles quotes : encadre une chaîne de caractères et annule la signification de $, \ et &#039;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;`&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
back quotes : substitution de commandes&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
simples quotes : encadre une chaîne de caractères et annule la signification de tous les caractères spéciaux&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
commentaire&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;( )&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
exécution d&#039;un shell fils&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;[ ]&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
test&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;|&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
pipe&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
variable&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
remplace 0 ou n caractères&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;!&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
négation d&#039;un test&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;?&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
remplace 1 caractère&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;&amp;lt; &amp;gt;&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
redirections entrée, sortie&lt;br /&gt;
|- bgcolor=&amp;quot;#CCCCCC&amp;quot;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;$0...$9&#039;&#039;&#039;&lt;br /&gt;
| width=&amp;quot;92%&amp;quot; |&lt;br /&gt;
variables de position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Appel des commandes ===&lt;br /&gt;
&lt;br /&gt;
Autre élément à connaître pour ne pas avoir de surprise : à quel type de commande ai-je à faire ? on distingue des grands types de commande&lt;br /&gt;
&lt;br /&gt;
* des commandes internes au shell : elles sont exécutées dans le même shell. si elles sont lancées à partir du shell père, il n&#039;y aura pas création de shell fils&lt;br /&gt;
* des programmes binaires exécutables&lt;br /&gt;
* des fichiers de commande (shell-scripts)&lt;br /&gt;
* des alias&lt;br /&gt;
* des fonctions&lt;br /&gt;
&lt;br /&gt;
La difficulté c&#039;est que le shell interprète une commande en suivant un ordre très précis :&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;le chemin de la commande comporte un /&#039;&#039;&#039;, il exécute donc la commande située dans ce chemin, il n&#039;y a pas d&#039;ambiguïté possible.&lt;br /&gt;
* &#039;&#039;&#039;le chemin de la commande ne comporte pas de /&#039;&#039;&#039;, il cherche la commande en suivant les étapes suivantes : &amp;lt;br /&amp;gt;&lt;br /&gt;
*# consultation de la liste des alias&lt;br /&gt;
*# consultations des fonctions chargées&lt;br /&gt;
*# consultations des commandes internes du shell&lt;br /&gt;
*# consultation de la variable PATH&lt;br /&gt;
&lt;br /&gt;
Donc si vous tapez une commande quelleconque, un script shell par exemple, sans préciser le chemin, la consultation de la variable PATH n&#039;arrive qu&#039;en dernier. Attention si vous disposez d&#039;un alias ou d&#039;une fonction qui porte le même nom, il traitera l&#039;alias ou la fonction.&lt;br /&gt;
&lt;br /&gt;
Pour terminer 2 commandes utiles pour savoir à quel type de commande vous avez à faire :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;&#039;&#039;type nom_de_commande&#039;&#039;&#039;&amp;lt;/code&amp;gt; : permet de déterminer le type d&#039;une commande (alias, fonction, commande interne...)&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;&#039;&#039;which nom_de_commande&#039;&#039;&#039;&amp;lt;/code&amp;gt; : recherche le chemin de la commande dans PATH&lt;br /&gt;
exemples :&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; type ls &amp;lt;br /&amp;gt; ls est un alias suivi pour /usr/bin/ls &amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; type cd &amp;lt;br /&amp;gt; cd est une commande prédéfinie du shell &amp;lt;br /&amp;gt;&#039;&#039;&#039;[user@localhost user]$&#039;&#039;&#039; which pwd &amp;lt;br /&amp;gt; /usr/bin/pwd &amp;lt;br /&amp;gt; &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Index des commandes ==&lt;br /&gt;
&lt;br /&gt;
heu... bon là j&#039;en ai marre, on verra ça plus tard ! &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;:-)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je place quand même ici 2 commandes qui peuvent être bien utiles :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;cal&amp;lt;/code&amp;gt;&#039;&#039;&#039; : donne le calendrier du mois courant, &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cal 12 1999&amp;lt;/code&amp;gt; : donne le calendrier de décembre 1999, &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;cal 2000&amp;lt;/code&amp;gt; : donne le calendrier des 12 mois de l&#039;an 2000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;factor&#039;&#039;&#039; 12456988&amp;lt;/code&amp;gt; : donne la décomposition en produit de facteurs premiers du nombre 12456988 (soit  2 x 2 x 17 x 183191) - c&#039;est très mathématique, mais ultra rapide et puissant.&lt;br /&gt;
&lt;br /&gt;
Pour terminer cet article, je vous renvoie vers ce petit manuel de référence, qui contient l&#039;ensemble des commandes usuelles :&lt;br /&gt;
&lt;br /&gt;
* [http://www.softndesign.org/?page=manuels/unix-1.php〈=FR  Débuter en shell],&lt;br /&gt;
* [http://www.softndesign.org/?page=manuels/unix-2.php〈=FR  Petit manuel de référence],&lt;br /&gt;
* [http://www.softndesign.org/?page=manuels/unix-3.php〈=FR  Pour aller plus loin].&lt;br /&gt;
et aussi :&lt;br /&gt;
* [http://club.mandriva.com/xwiki/bin/KB/BasicsIndex#shell〈=FR  Les bases du shell]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;merci&amp;quot;&amp;gt;Cette page est issue de la documentation &#039;pré-wiki&#039; de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Jean-Christophe Cardot le 02/11/1999.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 02/11/1999, Jean-Christophe Cardot&lt;br /&gt;
{{CC-BY-NC-SA}}&lt;/div&gt;</summary>
		<author><name>Basile S (phorum)</name></author>
	</entry>
</feed>