<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Coder-Studio &#187; Linux</title>
	<atom:link href="http://www.coder-studio.com/blog/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coder-studio.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 31 Mar 2010 00:00:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mon premier robot &#8211; Premier prototype</title>
		<link>http://www.coder-studio.com/blog/mon-premier-robot-premier-prototype/</link>
		<comments>http://www.coder-studio.com/blog/mon-premier-robot-premier-prototype/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 21:40:34 +0000</pubDate>
		<dc:creator>Aquanum</dc:creator>
				<category><![CDATA[Embarqué]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Robotique]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[Fox Board]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[wifi]]></category>
		<category><![CDATA[wiimote]]></category>

		<guid isPermaLink="false">http://www.coder-studio.com/blog/?p=254</guid>
		<description><![CDATA[
Je réalise mon rêve d&#8217;enfance en ce moment, la réalisation d&#8217;un robot de A à Z. Je regrette de finir mes études à l&#8217;UTT dans 2 mois, ça commence à devenir vraiment passionnant ! Donc en fait je travaille sur un robot wifi commandé par manette de wii. J&#8217;ai réussi à caser ça comme projet [...]]]></description>
			<content:encoded><![CDATA[<p><object width="425" height="344" data="http://www.youtube.com/v/eSErBSeCOCU&amp;hl=fr&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/eSErBSeCOCU&amp;hl=fr&amp;fs=1" /><param name="allowfullscreen" value="true" /></object></p>
<p style="text-align: justify;">Je réalise mon rêve d&#8217;enfance en ce moment, la réalisation d&#8217;un robot de A à Z. Je regrette de finir mes études à l&#8217;UTT dans 2 mois, ça commence à devenir vraiment passionnant ! Donc en fait je travaille sur un robot wifi commandé par manette de wii. J&#8217;ai réussi à caser ça comme projet dans mon cursus, au lieu de faire un cours bouche trou pour finir ma 5eme année, bah je me suis lancé avec un autre étudiant dans le développement d&#8217;un chti robot <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Il ne s&#8217;agit pour l&#8217;instant que de notre premier prototype, comme vous pouvez le voir il n&#8217;est pas entièrement autonome. On doit encore travailler sur l&#8217;alimentation du système embarqué (Carte Fox), du routeur wifi et des servomoteurs. Pour l&#8217;instant on a des gros fils rattachés au robot. On cherche des batteries adaptées pour alimenter tout ça. C&#8217;est que ça pompe du courant ce ptit machin.</p>
<p style="text-align: justify;">Il reste encore du boulot, le robot a la fâcheuse tendance à se mettre en mode autiste et à faire n&#8217;importe quoi. On a écarté un problème lié au wifi, donc ça doit venir du code qui marche paaaas bien <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Reste ensuite à faire marcher la pince, qui n&#8217;a pas encore été implémentée dans le code. Ensuite on pourra utiliser OpenCV pour faire un peu de traitement d&#8217;image et donner la possibilité au robot de repérer un certain nombre de choses.</p>
<p style="text-align: justify;">Je suis en train de me préparer un blog perso exprès pour présenter l&#8217;avancement de mes projets de robotique, et de programmation en générale. Je posterai de temps en temps sur Coder-Studio mon avancement du projet <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  et donnerai à l&#8217;occasion l&#8217;adresse pour compléter mes billets sur mes robots. Sinon, désolé pour la vidéo, elle est assez courte et on ne voit pas trop la manette de wii. En fait je n&#8217;avais plus de place sur ma carte mémoire&#8230;</p>
<p style="text-align: justify;">Voilà donc c&#8217;est un premier aperçu très rapide du projet. Je ferai une vidéo plus complète au prochain épisode avec un billet contenant plus de détails sur le robot <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/mon-premier-robot-premier-prototype/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Trucs et astuces sous GNU/Linux</title>
		<link>http://www.coder-studio.com/blog/trucs-et-astuces-gnu-linux/</link>
		<comments>http://www.coder-studio.com/blog/trucs-et-astuces-gnu-linux/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 22:01:11 +0000</pubDate>
		<dc:creator>nicolas66</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnu]]></category>

		<guid isPermaLink="false">http://www.coder-studio.com/blog/?p=197</guid>
		<description><![CDATA[Bonjour à tous,
Mon premier billet sur ce blog dresse une liste de quelques &#171;&#160;trucs et astuces&#160;&#187; utiles dans un environnement GNU/Linux. Cette liste sera progressivement complétée à l&#8217;avenir. On considère ici que le shell utilisé est bash. Les astuces sont facilement transposables à d&#8217;autres shells.

Sommaire :

Backspace sous Firefox
Suppression de fichiers
Recherche de texte dans les pages [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>
<p>Mon premier billet sur ce blog dresse une liste de quelques &laquo;&nbsp;trucs et astuces&nbsp;&raquo; utiles dans un environnement GNU/Linux. Cette liste sera progressivement complétée à l&#8217;avenir. On considère ici que le shell utilisé est <em>bash</em>. Les astuces sont facilement transposables à d&#8217;autres shells.</p>
<p><span id="more-197"></span></p>
<h3>Sommaire :</h3>
<ol>
<li><a href="#backspace_firefox">Backspace sous Firefox</a></li>
<li><a href="#suppression_fichiers">Suppression de fichiers</a></li>
<li><a href="#recherche_manpages">Recherche de texte dans les pages de manuel</a></li>
<li><a href="#coloration_nano">Coloration syntaxique sous nano</a></li>
<li><a href="#manpages_couleur">Manpages en couleur</a></li>
<li><a href="#coloration_enscript">Coloration syntaxique avec <em>enscript</em></a></li>
<li><a href="#renommage_massif">Renommage de fichiers massif</a></li>
<li><a href="#grep_couleurs">Couleurs sous <em>grep</em></a></li>
<li><a href="#terminal_repertoire_travail">Terminal &amp; répertoire de travail</a></li>
<li><a href="#tuer_processus">Tuer un processus par son nom</a></li>
<li><a href="#detacher_commande_terminal">Détacher une commande d&#8217;un terminal</a></li>
<li><a href="#backup_paquets">Backup des paquets sous <em>Debian</em> / <em>Ubuntu</em></a></li>
<li><a href="#expansion_accolades">Expansion d&#8217;accolades</a></li>
<li><a href="#recherche_fichiers">Recherche de fichiers</a></li>
<li><a href="#remplacement_chaines_fichiers">Remplacement de chaînes dans des fichiers</a></li>
<li><a href="#creation_repertoires">Création de répertoires</a></li>
<li><a href="#recuperation_codes_retour">Récupération de codes de retour</a></li>
<li><a href="#raccourcis_clavier_sous_bash">Raccourcis clavier sous bash</a></li>
<li><a href="#generation_chaine_aleatoire">Génération de chaîne aléatoire</a></li>
<li><a href="#reutilisation_commandes_arguments">Réutilisation de commandes et d&#8217;arguments</a></li>
<li><a href="#recherche_rapide_fichier">Recherche rapide dans un fichier</a></li>
<li><a href="#decompression_archives">Décompression d&#8217;archives</a></li>
<li><a href="#comparaison_fichiers">Comparaison de fichiers</a></li>
<li><a href="#comparaison_fichiers_ssh">Comparaison de fichiers via <em>ssh</em></a></li>
</ol>
<p><a name="backspace_firefox"><br />
<h3>1 &#8211; Backspace sous Firefox</h3>
<p></a><br />
Cette première astuce permet d&#8217;activer la touche <em>backspace</em> pour revenir aux pages précédentes sous Firefox. Voici la démarche à suivre :</p>
<ol>
<li>Démarrer Firefox.</li>
<li>Taper <em>about:config</em> dans la barre d&#8217;adresse.</li>
<li>Taper <em>backspace</em> dans le champ <em>filtre</em> de la page pour voir apparaître la clé <em>browser.backspace_action</em>.</li>
<li>Remplacer la valeur de la clé par 0.</li>
</ol>
<p><a name="suppression_fichiers"><br />
<h3>2 &#8211; Suppression de fichiers</h3>
<p></a><br />
La plupart des adeptes de la console sous GNU/Linux savent que la suppression des fichiers / répertoires est définitive. Même avec la meilleure des attentions, il reste possible de supprimer un fichier / répertoire par erreur. Pour pallier ce problème, une solution simple est de dériver le comportement initial de la commande <em>rm</em>. Le code qui suit se place dans le fichier <em>~/.bashrc</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code43'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19743"><td class="code" id="p197code43"><pre class="shell" style="font-family:monospace;">function Delete()
{
	mv $@ $HOME/.local/share/Trash/files/
}
&nbsp;
function Purge()
{
	\rm -rf $HOME/.local/share/Trash/files/*
	\rm -rf $HOME/.local/share/Trash/info/*
}
&nbsp;
alias rm='Delete'
alias purge='Purge'</pre></td></tr></table></div>

<p>La première fonction sert à supprimer déplacer les fichiers dans la corbeille tandis que la seconde vide son contenu.<br />
<strong>Note:</strong> sur les anciennes version d&#8217;<em>Ubuntu</em> par exemple, la corbeille pointait sur <em>~/.Trash</em>.</p>
<p><a name="recherche_manpages"><br />
<h3>3 &#8211; Recherche de texte dans les pages de manuel</h3>
<p></a><br />
Les pages de manuel sont un outil essentiel pour tout programmeur sous GNU/Linux. Seulement parfois, certaines pages sont très longues (ex: <em>gcc</em>) et on préfèrerait effectuer une recherche ciblée avec des mots-clés. Mais comment faire ? Admettons que nous souhaitions rechercher le mot-clé <em>color</em> dans la page de manuel de <em>ls</em>. Pour lancer une recherche, il suffit de taper <em>/color</em>. On accède ensuite aux occurences suivantes (respectivement précédentes) via la touche <em>n</em> (respectivement <em>N</em>).</p>
<p><a name="coloration_nano"><br />
<h3>4 &#8211; Coloration syntaxique sous nano</h3>
<p></a><br />
Beaucoup d&#8217;entres vous ont sans doute remarqué que la coloration syntaxique est absente par défaut sous l&#8217;éditeur <em>nano</em>. Nous allons donc voir comment l&#8217;activer simplement. Commencez par créer un fichier de configuration <em>.nanorc</em> à la racine de votre compte avec le contenu suivant puis sauvegardez :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code44'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19744"><td class="code" id="p197code44"><pre class="shell" style="font-family:monospace;">## Fichier nanorc
include &quot;/usr/share/nano/nanorc.nanorc&quot;
&nbsp;
## C/C++
include &quot;/usr/share/nano/c.nanorc&quot;
&nbsp;
## HTML
include &quot;/usr/share/nano/html.nanorc&quot;
&nbsp;
## TeX
include &quot;/usr/share/nano/tex.nanorc&quot;
&nbsp;
## Emails
include &quot;/usr/share/nano/mutt.nanorc&quot;
&nbsp;
## Fichiers patch
include &quot;/usr/share/nano/patch.nanorc&quot;
&nbsp;
&nbsp;
## Pages de manuel
include &quot;/usr/share/nano/man.nanorc&quot;
&nbsp;
## Groff
include &quot;/usr/share/nano/groff.nanorc&quot;
&nbsp;
## Perl
include &quot;/usr/share/nano/perl.nanorc&quot;
&nbsp;
## Python
include &quot;/usr/share/nano/python.nanorc&quot;
&nbsp;
## Ruby
include &quot;/usr/share/nano/ruby.nanorc&quot;
&nbsp;
## Java
include &quot;/usr/share/nano/java.nanorc&quot;
&nbsp;
## Assembleur
include &quot;/usr/share/nano/asm.nanorc&quot;
&nbsp;
## Scripts bash
include &quot;/usr/share/nano/sh.nanorc&quot;
&nbsp;
## POV-Ray
include &quot;/usr/share/nano/pov.nanorc&quot;</pre></td></tr></table></div>

<p>Chaque instruction correspond à l&#8217;inclusion d&#8217;un fichier à l&#8217;extension <em>.nanorc</em>. Ces fichiers contiennent en fait des paramètres de coloration syntaxique pour divers langages (ex: <em>java</em> pour le fichier <em>java.nanorc</em>). Vous pouvez dores et déjà admirer le résultat en éditant un fichier <em>C/C++</em>.</p>
<p>Néanmoins, on peut noter que la coloration de certains types de fichiers (<em>.ini</em>, <em>.sourcelist</em>, <em>.conf</em>, <em>.php</em>, <em>.css</em> et <em>.xml</em>) est absente. Manuel Dorne (alias Korben) met à disposition sur son blog une <a href="http://www.korben.info/wp-content/uploads/2008/08/nano-supplement.tar">archive</a> contenant les fichiers de coloration correspondant. Il suffit ensuite de rajouter les lignes suivantes à votre fichier de configuration <em>~/.nanorc</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code45'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19745"><td class="code" id="p197code45"><pre class="shell" style="font-family:monospace;">## Sources.list
include &quot;/usr/share/nano/sourceslist.nanorc&quot;
&nbsp;
## Fichiers de config. (.ini)
include &quot;/usr/share/nano/ini.nanorc&quot;
&nbsp;
## Xorg.conf
include &quot;/usr/share/nano/xorg.nanorc&quot;
&nbsp;
## CSS
include &quot;/usr/share/nano/css.nanorc&quot;
&nbsp;
## XML
include &quot;/usr/share/nano/xml.nanorc&quot;
&nbsp;
## Generic .conf
include &quot;/usr/share/nano/conf.nanorc&quot;
&nbsp;
## PHP
include &quot;/usr/share/nano/php.nanorc&quot;</pre></td></tr></table></div>

<p><a name="manpages_couleur"><br />
<h3>5 &#8211; Manpages en couleur</h3>
<p></a><br />
Qui n&#8217;a jamais rêvé d&#8217;avoir ses pages de manuel en couleur ? Ajoutez simplement les lignes suivantes à votre fichier de configuration <em>~/.bashrc</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code46'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19746"><td class="code" id="p197code46"><pre class="shell" style="font-family:monospace;">export LESS_TERMCAP_mb=$'\E[01;31m'       # begin blinking
export LESS_TERMCAP_md=$'\E[01;38;5;74m'  # begin bold
export LESS_TERMCAP_me=$'\E[0m'           # end mode
export LESS_TERMCAP_se=$'\E[0m'           # end standout-mode
export LESS_TERMCAP_so=$'\E[38;5;246m'    # begin standout-mode - info box
export LESS_TERMCAP_ue=$'\E[0m'           # end underline
export LESS_TERMCAP_us=$'\E[04;38;5;146m' # begin underline</pre></td></tr></table></div>

<p>Cette <a href="http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/">page</a> indique comment utiliser d&#8217;autres codes couleurs.</p>
<p><a name="coloration_enscript"><br />
<h3>6 &#8211; Coloration syntaxique avec <em>enscript</em></h3>
<p></a><br />
La commande <em>enscript</em> transforme un fichier texte au format <em>ASCII</em> en <em>PostScript</em>/<em>HTML</em> et permet accessoirement de faire de la coloration syntaxique. Commencez d&#8217;abord par installer le paquet correspondant (paquet <em>enscript</em> sous <em>Debian</em>/<em>Ubuntu</em>). Ensuite, il suffit de convertir le fichier désiré à l&#8217;aide de la commande. Voici un exemple de transformation d&#8217;un fichier assembleur en fichier <em>HTML</em> avec coloration :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code47'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19747"><td class="code" id="p197code47"><pre class="shell" style="font-family:monospace;">enscript -Easm --color -whtml -poutput.html main.asm</pre></td></tr></table></div>

<p>La liste des langages disponibles est accessible via la commande suivante :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code48'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19748"><td class="code" id="p197code48"><pre class="shell" style="font-family:monospace;">enscript --help-highlight | awk '$0 ~/Name:/ {FS=&quot; &quot;; print $2;}'</pre></td></tr></table></div>

<p><a name="renommage_massif"><br />
<h3>7 &#8211; Renommage de fichiers massif</h3>
<p></a><br />
Si vous en avez marre de renommer à la main tous les fichiers musicaux de votre audiothèque alors cette astuce est faite pour vous.</p>
<ul>
<li><strong>rename</strong><br />
Pour renommer massivement des fichiers, le moyen le plus simple est d&#8217;utiliser la commande <em>rename</em> dont les expressions régulières sont similaires à celles de la commande <em>sed</em>.Supposons que nous ayions une liste de chansons nommées ainsi :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code49'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19749"><td class="code" id="p197code49"><pre class="shell" style="font-family:monospace;">01-Les Histoires de Martin-Martin et les abeilles.ogg
02-Les Histoires de Martin-Martin chez les scouts.ogg
03-Les Histoires de Martin-Martin aime Martine.ogg</pre></td></tr></table></div>

<p>On souhaite supprimer les numéros des chansons. Il suffit de lancer la commande suivante :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code50'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19750"><td class="code" id="p197code50"><pre class="shell" style="font-family:monospace;">rename 's/(.*)-(.*)-(.*).ogg/$1-$3.ogg/' *.ogg</pre></td></tr></table></div>

<p>où $k correspond au k-ième match indiqué entre parenthèses par (.*).</p>
<p>On obtient alors :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code51'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19751"><td class="code" id="p197code51"><pre class="shell" style="font-family:monospace;">01-Martin et les abeilles.ogg
02-Martin chez les scouts.ogg
03-Martin aime Martine.ogg</pre></td></tr></table></div>

<p>Pour mettre en majuscule le noms des fichiers, il faut utiliser l&#8217;option <em>y</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code52'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19752"><td class="code" id="p197code52"><pre class="shell" style="font-family:monospace;">rename 's/(.*)-(.*)-(.*).ogg/$1-$3.ogg/;y/[a-z]/[A-Z]/' *.ogg</pre></td></tr></table></div>

<p><strong>Note:</strong> le flag <em>-n</em> permet de pré-visualiser le renommage (pratique pour éviter les éventuelles bourdes).</li>
<li><em><strong>Mmv</strong><br />
</em>Alternativement à <em>rename</em>, le renommage massif peut aussi être effectué via <em>Mmv</em> (paquet <em>mmv</em> sous <em>Debian</em>/<em>Ubuntu</em>), bien plus puissant. <em>Mmv</em> est composé d&#8217;un ensemble de commandes capables de déplacer (<em>mmv</em>), copier (<em>mcp</em>) et créer des liens symboliques (<em>mln</em>) sur des fichiers. Supposons que nous ayions une liste de recettes de cuisine avec le nom de l&#8217;auteur :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code53'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19753"><td class="code" id="p197code53"><pre class="shell" style="font-family:monospace;">26-11-1988_Martin_Gâteau au chocolat.texte
19-04-1972_Elsa_Babas au rhum.texte
03-12-1995_John_Cookies américains.texte</pre></td></tr></table></div>

<p>On souhaite maintenant renommer ces fichiers en excluant la date et en modifiant l&#8217;extension en <em>.txt</em>. On exécute alors la commande qui suit :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code54'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19754"><td class="code" id="p197code54"><pre class="shell" style="font-family:monospace;">mmv -n &quot;*_*_*.texte&quot; &quot;#3 - #2.txt&quot;</pre></td></tr></table></div>

<p>où #k correspond au k-ième match indiqué par un joker (? ou *).</p>
<p>On obtient alors :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code55'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19755"><td class="code" id="p197code55"><pre class="shell" style="font-family:monospace;">Gâteau au chocolat - Martin.txt
Babas au rhum - Elsa.txt
Cookies américains - John.txt</pre></td></tr></table></div>

<p>Pour mettre en majuscule (respectivement minuscule) tous les fichiers, il faut indiquer <em>u</em> dans l&#8217;expression #k (respectivement <em>l</em>) :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code56'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19756"><td class="code" id="p197code56"><pre class="shell" style="font-family:monospace;">mmv -n &quot;*.texte&quot; &quot;#u1.txt&quot;</pre></td></tr></table></div>

<p>L&#8217;option <em>-r</em> permet d&#8217;inclure les répertoire à renommer.</p>
<p>On peut aussi ajouter les recettes les unes à la suite des autres via l&#8217;option <em>-a</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code57'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19757"><td class="code" id="p197code57"><pre class="shell" style="font-family:monospace;">mmv -a &quot;*.texte &quot;recettes.texte&quot;</pre></td></tr></table></div>

<p><strong>Note:</strong> là encore, le flag <em>-n</em> permet de pré-visualiser le renommage.</p>
<p>Pour les adeptes de la souris, il existe d&#8217;autres outils de renommage comme Métamorphose, dotés d&#8217;une interface plus user-friendly. Plus d&#8217;infos sur ce site : <a href="http://file-folder-ren.sourceforge.net">http://file-folder-ren.sourceforge.net</a>.</li>
</ul>
<p><a name="grep_couleurs"><br />
<h3>8 &#8211; Couleurs sous <em>grep</em></h3>
<p></a><br />
La commande <em>grep</em> s&#8217;avère souvent utile pour rechercher facilement un motif dans un flux de données (stdin ou fichier). Néanmoins, il devient difficile de reconnaître le motif lorsque les lignes matchées sont de grande taille. Un moyen simple est d&#8217;activer la coloration en plaçant l&#8217;alias suivant dans votre fichier <em>~/.bashrc</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code58'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19758"><td class="code" id="p197code58"><pre class="shell" style="font-family:monospace;">alias grep=&quot;grep --color=auto&quot;</pre></td></tr></table></div>

<p>La coloration peut-être paramétrée en modifiant la variable <em>GREP_COLORS</em>. Plus d&#8217;infos sur la manpage de <em>grep</em>. Une liste détaillée des couleurs est accessible sur ce site : <a href="http://www.pixelbeat.org/docs/terminal_colours/">site</a>.</p>
<p><a name="terminal_repertoire_travail"><br />
<h3>9 &#8211; Terminal &amp; répertoire de travail</h3>
<p></a><br />
Beaucoup d&#8217;entre vous auront sans doute remarqué que le chemin et l&#8217;historique des commandes n&#8217;est pas sauvegardé lors du lancement d&#8217;un nouveau terminal. Pour pallier ce problème, il suffit de modifier la variable <em>PROMPT_COMMAND</em> du fichier <em>~/.bashrc</em>. Supposons que cette variable ait le contenu suivant (par défaut sous <em>Debian</em>/<em>Ubuntu</em>) :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code59'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19759"><td class="code" id="p197code59"><pre class="shell" style="font-family:monospace;">PROMPT_COMMAND='echo -ne &quot;\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007&quot;'</pre></td></tr></table></div>

<p>On la modifie alors comme suit :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code60'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19760"><td class="code" id="p197code60"><pre class="shell" style="font-family:monospace;">PROMPT_COMMAND='echo `pwd` &amp;gt; ~/.oldpwd; history -a; echo -ne &quot;\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007&quot;'</pre></td></tr></table></div>

<p>La première commande permet de sauvegarder le chemin courant dans le fichier <em>.oldpwd</em> tandis que la seconde sauvegarde l&#8217;historique.</p>
<p>Puis, à la fin du fichier, rajoutez cette ligne :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code61'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19761"><td class="code" id="p197code61"><pre class="shell" style="font-family:monospace;">cd &quot;`cat ~/.oldpwd`&quot;</pre></td></tr></table></div>

<p>Du coup, à l&#8217;ouverture d&#8217;un nouveau terminal (xterm, kconsole, etc.), le chemin et l&#8217;historique des commandes sera conservé. Pratique non ? <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a name="tuer_processus"><br />
<h3>10 &#8211; Tuer un processus par son nom</h3>
<p></a><br />
Pour tuer un processus qui semble ne plus répondre, on procède généralement de la manière suivante :</p>
<ul>
<li>On récupère le numéro du processus via :

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code62'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19762"><td class="code" id="p197code62"><pre class="shell" style="font-family:monospace;">      pid=$(ps -ef | grep nom_processus)</pre></td></tr></table></div>

<li>Puis, on tue le processus en lui envoyant un signal <em>SIGKILL</em> via :

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code63'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19763"><td class="code" id="p197code63"><pre class="shell" style="font-family:monospace;">      kill -9 ${pid}</pre></td></tr></table></div>

</ul>
<p>Une méthode alternative, plus courte, consiste à appeler la commande <em>killall</em> en lui passant directement le nom du processus :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code64'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19764"><td class="code" id="p197code64"><pre class="shell" style="font-family:monospace;">  killall nom_processus</pre></td></tr></table></div>

<p><a name="detacher_commande_terminal"><br />
<h3>11 &#8211; Détacher une commande d&#8217;un terminal</h3>
<p></a><br />
Un utilisateur est souvent amené à lancer des applications à partir d&#8217;un terminal (browser, lecteur audio, etc.). Parfois, il arrive aussi que l&#8217;on ferme un terminal par erreur. Cela a pour effet d&#8217;arrêter toutes les applications lancées à partir de ce terminal. Pour pallier ce problème, il suffit de détacher l&#8217;application du terminal via :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code65'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19765"><td class="code" id="p197code65"><pre class="shell" style="font-family:monospace;">nohup application &amp;</pre></td></tr></table></div>

<p>Par défaut, la commande <em>nohup</em> crée un fichier de sortie <em>nohup.out</em> contenant la sortie standard de la commande passée en paramètre. On peut supprimer ce comportement en redirigeant tous les flux vers <em>/dev/null</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code66'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19766"><td class="code" id="p197code66"><pre class="shell" style="font-family:monospace;">nohup application &amp;&gt;/dev/null &amp;</pre></td></tr></table></div>

<p>Libre à vous ensuite d&#8217;ajouter un alias dans votre <em>.bashrc</em> <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a name="backup_paquets"><br />
<h3>12 &#8211; Backup des paquets sous <em>Debian</em> / <em>Ubuntu</em></h3>
<p></a><br />
Lorsqu&#8217;on fait une réinstallation complète, on oublie parfois de sauvegarder la liste des paquets installés. Du coup, on ne réinstalle uniquement qu&#8217;une petite partie des paquets dont on a besoin. Voici comment procéder pour faire une backup de la liste des paquets installés.</p>
<p>Récupérez la liste des paquets installés sur le système dans un fichier appelé <em>packages.txt</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code67'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19767"><td class="code" id="p197code67"><pre class="shell" style="font-family:monospace;">sudo dpkg --get-selections &gt; packages.txt</pre></td></tr></table></div>

<p>Sauvegardez ce fichier sur CD, disquette ou clé USB. Ensuite, lors de la réinstallation, copiez ce fichier sur le disque dur et exécutez les trois commandes suivantes pour récupérer et installer vos paquets :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code68'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19768"><td class="code" id="p197code68"><pre class="shell" style="font-family:monospace;">sudo dpkg --set-selections &lt; packages.txt
sudo apt-get update
sudo apt-get dselect-upgrade</pre></td></tr></table></div>

<p>Pour éviter de télécharger à nouveau vos paquets, vous pouvez encore gagner du temps en les gravant directement sur CD. Ce <a href="https://help.ubuntu.com/community/AptMoveHowto">lien</a> explique la marche à suivre.</p>
<p><a name="expansion_accolades"><br />
<h3>13 &#8211; Expansion d&#8217;accolades</h3>
<p></a><br />
Sous <em>bash</em>, l&#8217;expansion d&#8217;accolades (braces expansion) est un mécanisme souvent méconnu mais extrêmement puissant qui permet de générer des chaînes de caractères arbitraires. Ce mécanisme est similaire à l&#8217;expansion de noms de fichiers hormis le fait qu&#8217;ils n&#8217;ont pas besoin d&#8217;exister. Les chaînes de caractères à générer sont décrites par des patterns. Ces patterns sont entourés d&#8217;accolades et séparés par des virgules. Chaque pattern peut lui-même être décrit par une liste de patterns. L&#8217;expansion s&#8217;effectue toujours de gauche à droite.</p>
<p>L&#8217;exemple qui suit permet de générer les chaînes <em>ade</em>, <em>ace</em> et <em>abe</em>.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code69'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19769"><td class="code" id="p197code69"><pre class="shell" style="font-family:monospace;">echo a{d,c,b}e
ade ace abe</pre></td></tr></table></div>

<p>Les patterns peuvent aussi contenir des nombres contenus dans un intervalle donné (un argument d&#8217;incrément est disponible uniquement à partir de bash 4). Par exemple, on peut vouloir générer les chaînes A0 à A9 pour chacune des lettres de l&#8217;alphabet :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code70'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19770"><td class="code" id="p197code70"><pre class="shell" style="font-family:monospace;">echo {A..Z}{0..9}
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 G0 G1 G2 G3 G4 G5 G6 G7 G8 G9 H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 I0 I1 I2 I3 I4 I5 I6 I7 I8 I9 J0 J1 J2 J3 J4 J5 J6 J7 J8 J9 K0 K1 K2 K3 K4 K5 K6 K7 K8 K9 L0 L1 L2 L3 L4 L5 L6 L7 L8 L9 M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 O0 O1 O2 O3 O4 O5 O6 O7 O8 O9 P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 U0 U1 U2 U3 U4 U5 U6 U7 U8 U9 V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 W0 W1 W2 W3 W4 W5 W6 W7 W8 W9 X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Z0 Z1 Z2 Z3 Z4 Z5 Z6 Z7 Z8 Z9</pre></td></tr></table></div>

<p>En pratique, l&#8217;expansion d&#8217;accolades est un mécanisme très agréable. On peut notamment l&#8217;utiliser pour faire une copie d&#8217;un fichier en évitant de retaper son nom :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code71'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19771"><td class="code" id="p197code71"><pre class="shell" style="font-family:monospace;">cp /home/rantanplan/medias/photos/mariage_de_loic/27/02/1998/originaux/photo1.jpg{,.bak}</pre></td></tr></table></div>

<p>Autre exemple concret : on souhaite récupérer plusieurs pages web qui ne diffèrent que par un numéro. Là encore, l&#8217;expansion d&#8217;accolades nous évite de recopier <em>n</em> fois le nom du fichier sur la ligne de commande ou bien d&#8217;utiliser explicitement une boucle :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code72'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19772"><td class="code" id="p197code72"><pre class="shell" style="font-family:monospace;">wget http://docs.example.com/documentation/slides_part{1..6}.html</pre></td></tr></table></div>

<p><a name="recherche_fichiers"><br />
<h3>14 &#8211; Recherche de fichiers</h3>
<p></a><br />
Parfois, il arrive que l&#8217;on souhaite effectuer une recherche d&#8217;un motif particulier à l&#8217;intérieur de fichiers situés dans plusieurs répertoires. Seulement, on aimerait limiter la recherche à quelques types de fichiers précis. </p>
<p>Par exemple, supposons que l&#8217;on veuille rechercher le motif &laquo;&nbsp;volume3D&nbsp;&raquo; à l&#8217;intérieur de fichiers C/C++. Cela est facilement réalisable en utilisant l&#8217;expansion d&#8217;accolades (cf. <a href="#expansion_accolades">section 13</a>) sur le paramètre <em>&#8211;include</em> de la commande <em>grep</em> :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code73'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19773"><td class="code" id="p197code73"><pre class="shell" style="font-family:monospace;">grep -R . -e &quot;volume3D&quot; --include=*.{c*,h*}</pre></td></tr></table></div>

<p><a name="remplacement_chaines_fichiers"><br />
<h3>15 &#8211; Remplacement de chaînes dans des fichiers</h3>
<p></a><br />
On veut parfois remplacer une chaîne de caractère dans plusieurs fichiers. Une manière simple de réaliser cela est d&#8217;utiliser l&#8217;interpréteur <em>Perl</em>. Supposons que l&#8217;on veuille remplacer la chaîne &laquo;&nbsp;tomate&nbsp;&raquo; par &laquo;&nbsp;salade&nbsp;&raquo; dans un ensemble de fichiers texte. Il suffit alors de taper la commande qui suit :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code74'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19774"><td class="code" id="p197code74"><pre class="shell" style="font-family:monospace;">perl -pi -e &quot;s/tomate/salade/g&quot; *.txt</pre></td></tr></table></div>

<p>Cela permet un gain de temps considérable surtout lorsque le nombre de fichiers est élevé <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a name="creation_repertoires"><br />
<h3>16 &#8211; Création de répertoires</h3>
<p></a><br />
Lors de la création d&#8217;une nouvelle arborescence, beaucoup de gens ont l&#8217;habitude de créer un par un les répertoires via <em>mkdir</em> puis de les déplacer via <em>mv</em>. Un moyen plus simple est d&#8217;utiliser l&#8217;option <em>-p</em> de la commande <em>mkdir</em> qui crée automatiquement les répertoires parents. Supposons que l&#8217;on souhaite avoir une arborescence de photos de vacances classées par lieu puis par date :</p>
<pre>
photos_vacances/
|-- Antibes
|   |-- 2008
|   |   `-- 07
|   |       |-- 28
|   |       |-- 29
|   |       |-- 30
|   |       `-- 31
|   `-- 2009
|       `-- 07
|           |-- 12
|           |-- 13
|           |-- 14
|           |-- 15
|           |-- 16
|           |-- 17
|           |-- 18
|           |-- 19
|           `-- 20
`-- Lyon
    |-- 1999
    |   `-- 08
    |       |-- 01
    |       |-- 02
    |       |-- 03
    |       `-- 04
    `-- 2002
        |-- 07
        |   |-- 12
        |   |-- 13
        |   |-- 14
        |   |-- 15
        |   `-- 16
        `-- 12
            |-- 24
            |-- 25
            |-- 26
            |-- 27
            `-- 28
</pre>
<p>En combinant l&#8217;expansion d&#8217;accolades, on obtient alors les commandes suivantes :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code75'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19775"><td class="code" id="p197code75"><pre class="shell" style="font-family:monospace;">mkdir -p photos_vacances/Antibes/2008/07/{28..31}
mkdir -p photos_vacances/Antibes/2009/07/{12..20}
mkdir -p photos_vacances/Lyon/1999/08/0{1..4}
mkdir -p photos_vacances/Lyon/2002/07/{12..16}
mkdir -p photos_vacances/Lyon/2002/12/{24..28}</pre></td></tr></table></div>

<p><a name="recuperation_codes_retour"><br />
<h3>17 &#8211; Récupération de codes de retour</h3>
<p></a><br />
Parfois, on aimerait pouvoir récupérer un code de retour précis sur une commande composée de plusieurs pipes. Par exemple, imaginons que nous souhaitions savoir si l&#8217;utilisateur &laquo;&nbsp;daniel&nbsp;&raquo; est connecté sur une machine. Une commande possible serait alors la suivante (la commande sort n&#8217;est présente que pour illustrer l&#8217;exemple) :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code76'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19776"><td class="code" id="p197code76"><pre class="shell" style="font-family:monospace;">who | awk '{print $1}' | grep &quot;daniel&quot; | sort</pre></td></tr></table></div>

<p>Sous <em>Bash</em>, il est possible de récupérer les codes de retour de chacune des commandes dans un tableau appelé <em>PIPESTATUS</em>. Pour obtenir les codes de retour, il suffit alors de consulter ce tableau :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code77'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19777"><td class="code" id="p197code77"><pre class="shell" style="font-family:monospace;">echo ${PIPESTATUS[*]}</pre></td></tr></table></div>

<p>Dans l&#8217;exemple, si l&#8217;utilisateur &laquo;&nbsp;daniel&nbsp;&raquo; n&#8217;est pas connecté, la commande précédente afficherait ceci :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code78'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19778"><td class="code" id="p197code78"><pre class="shell" style="font-family:monospace;">0 0 1 0</pre></td></tr></table></div>

<p><a name="raccourcis_clavier_sous_bash"><br />
<h3>18 &#8211; Raccourcis clavier sous <em>bash</em></h3>
<p></a><br />
Voici une sélection des raccourcis clavier utiles sous <em>bash</em> :</p>
<ul>
<li><b>Ctrl+U</b> : supprimer tout ce qui est présent à gauche</li>
<li><b>Ctrl+W</b> : supprimer uniquement le premier mot à gauche</li>
<li><b>Ctrl+Y</b> : coller le contenu du buffer</li>
<li><b>Ctrl+A</b> : se déplacer au début de la ligne</li>
<li><b>Ctrl+E</b> : se déplacer à la fin de la ligne</li>
</ul>
<p><a name="generation_chaine_aleatoire"><br />
<h3>19 &#8211; Génération de chaîne aléatoire</h3>
<p></a><br />
Une méthode rapide et simple pour générer une chaîne aléatoire est de remplacer les symboles issus du fichier <em>/dev/urandom</em> par des caractères alphanumériques et de couper à la longueur désirée :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code79'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19779"><td class="code" id="p197code79"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>urandom <span style="color: #c20cb9; font-weight: bold;">tr</span> <span style="color: #660033;">-dc</span> A-Za-z0-<span style="color: #000000;">9</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">head</span> <span style="color: #660033;">-c8</span></pre></td></tr></table></div>

<p><a name="reutilisation_commandes_arguments"><br />
<h3>20 &#8211; Réutilisation de commandes et d&#8217;arguments</h3>
<p></a><br />
Sur un terminal, on passe généralement beaucoup de temps à rappeler des commandes antérieures ou des commandes qui ne diffèrent seulement que par quelques arguments. Par exemple, supposons que nous ayons tapé la commande <em>cd foo</em> et qu&#8217;elle retourne un message d&#8217;erreur indiquant que le répertoire <em>foo</em> n&#8217;existe pas. Supposons maintenant que nous souhaitions créer ce répertoire. Cela implique donc de rappeler la commande précédente, de l&#8217;éditer et de la lancer. Dans bien des cas, ces étapes sont fastidieuses. Bash propose une liste d&#8217;alias, souvent méconnue, qui permet de gagner un temps précieux :</p>
<ul>
<li><b>!n</b> : rappelle la commande numéro n</li>
<li><b>!-n</b> : rappelle la commande exécutée il y a n commandes</li>
<li><b>!!</b> : rappelle la dernière commande</li>
<li><b>!chaine</b> : rappelle la commande la plus récente commençant par &laquo;&nbsp;chaine&nbsp;&raquo;</li>
<li><b>!?chaine</b> : rappelle la commande la plus récente finissant par &laquo;&nbsp;chaine&nbsp;&raquo;</li>
<li><b>!?chaine?</b> : rappelle la commande la plus récente contenant par &laquo;&nbsp;chaine&nbsp;&raquo;</li>
<li><b>^chaine1^chaine2^</b> : répète la dernière commande en remplaçant &laquo;&nbsp;chaine1&#8243; par &laquo;&nbsp;chaine2&#8243;</li>
<li><b>!#</b> : rappelle la plus ancienne commande</li>
<li><b>commande !^</b> : exécute &laquo;&nbsp;commande&nbsp;&raquo; avec le premier argument de la commande précédente</li>
<li><b>commande !:n</b> : exécute &laquo;&nbsp;commande&nbsp;&raquo; avec l&#8217;argument numéro n de la commande précédente</li>
<li><b>commande !:x-y</b> : exécute &laquo;&nbsp;commande&nbsp;&raquo; avec les arguments numéro &laquo;&nbsp;x&nbsp;&raquo; à &laquo;&nbsp;y&nbsp;&raquo; de la commande précédente</li>
<li><b>commande !$</b> : exécute &laquo;&nbsp;commande&nbsp;&raquo; avec le dernier argument de la commande précédente</li>
<li><b>commande !-2$</b> : exécute &laquo;&nbsp;commande&nbsp;&raquo; avec le dernier argument de l&#8217;avant dernière commande</li>
</ul>
<p>Un exemple d&#8217;utilisation est lorsque l&#8217;on oublie de préfixer une commande par &laquo;&nbsp;sudo&nbsp;&raquo;. Pour rappeler la commande précédente en rajoutant ce préfixe, il suffit alors de taper : <em>sudo !!</em>.</p>
<p><a name="recherche_rapide_fichier"><br />
<h3>21 &#8211; Recherche rapide dans un fichier</h3>
<p></a><br />
Un moyen rapide et concis de rechercher un motif dans un fichier <em>fichier.txt </em> (sans passer par la commande <em>cat</em>) est le suivant :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code80'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19780"><td class="code" id="p197code80"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;</span> fichier.txt <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot;motif&quot;</span></pre></td></tr></table></div>

<p>La commande peut alors aisément être complétée pour compter par exemple le nombre de matchs :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code81'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19781"><td class="code" id="p197code81"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;</span> fichier.txt <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot;motif&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">wc</span> <span style="color: #660033;">-l</span></pre></td></tr></table></div>

<p><a name="decompression_archives"><br />
<h3>22 &#8211; Décompression d&#8217;archives</h3>
<p></a><br />
Marre de se rappeler les arguments à passer pour décompresser une archive tar.gz, .zip, .rar, etc. ? Voici une commande générique pour décompresser n&#8217;importe quelle type d&#8217;archive :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code82'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19782"><td class="code" id="p197code82"><pre class="bash" style="font-family:monospace;">extract<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">in</span>
         <span style="color: #000000; font-weight: bold;">*</span>.tar.bz2<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> xvjf <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.tar.gz<span style="color: #7a0874; font-weight: bold;">&#41;</span>  <span style="color: #c20cb9; font-weight: bold;">tar</span> xvzf <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.bz2<span style="color: #7a0874; font-weight: bold;">&#41;</span>     <span style="color: #c20cb9; font-weight: bold;">bunzip2</span> <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.rar<span style="color: #7a0874; font-weight: bold;">&#41;</span>     unrar x <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.gz<span style="color: #7a0874; font-weight: bold;">&#41;</span>      <span style="color: #c20cb9; font-weight: bold;">gunzip</span> <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.tar<span style="color: #7a0874; font-weight: bold;">&#41;</span>     <span style="color: #c20cb9; font-weight: bold;">tar</span> xvf <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.tbz2<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #c20cb9; font-weight: bold;">tar</span> xvjf <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.tgz<span style="color: #7a0874; font-weight: bold;">&#41;</span>     <span style="color: #c20cb9; font-weight: bold;">tar</span> xvzf <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.zip<span style="color: #7a0874; font-weight: bold;">&#41;</span>     <span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.Z<span style="color: #7a0874; font-weight: bold;">&#41;</span>       uncompress <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span>.7z<span style="color: #7a0874; font-weight: bold;">&#41;</span>      7z x <span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">;;</span>
         <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>         <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;'$1' cannot be extracted&quot;</span><span style="color: #000000; font-weight: bold;">;;</span>
        <span style="color: #000000; font-weight: bold;">esac</span>
    <span style="color: #000000; font-weight: bold;">else</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;'$1' is not a valid file&quot;</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></td></tr></table></div>

<p>Une fois installé, on ne peut plus s&#8217;en passer <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Source : <a href="http://www.shell-fu.org/lister.php?id=375">shell-fu.org</a>.</p>
<p><a name="comparaison_fichiers"><br />
<h3>24 &#8211; Comparaison de fichiers</h3>
<p></a><br />
Un moyen simple de pouvoir comparer le contenu de deux répertoires est d&#8217;utiliser la commande <em>diff</em> comme suit :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code83'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19783"><td class="code" id="p197code83"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #660033;">-u</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-c1</span> repertoire1<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-c1</span> repertoire2<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></td></tr></table></div>

<p><b>Note</b> : l&#8217;option <em>c1</em> passée à <em>ls</em> liste les fichiers en une seule colonne.</p>
<p><a name="comparaison_fichiers_ssh"><br />
<h3>24 &#8211; Comparaison de fichiers via <em>ssh</em></h3>
<p></a><br />
La commande ci-dessous permet de comparer deux fichiers à travers ssh :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p197code84'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19784"><td class="code" id="p197code84"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ssh</span> <span style="color: #c20cb9; font-weight: bold;">login</span><span style="color: #000000; font-weight: bold;">@</span><span style="color: #c20cb9; font-weight: bold;">hostname</span> <span style="color: #ff0000;">&quot;cat /tmp/fichier_distant.txt&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">diff</span> - <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>fichier_local.txt</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/trucs-et-astuces-gnu-linux/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Interface GSM sur système Linux embarqué</title>
		<link>http://www.coder-studio.com/blog/interface-gsm-sur-systeme-linux-embarque/</link>
		<comments>http://www.coder-studio.com/blog/interface-gsm-sur-systeme-linux-embarque/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 15:38:38 +0000</pubDate>
		<dc:creator>Aquanum</dc:creator>
				<category><![CDATA[C & C++]]></category>
		<category><![CDATA[Embarqué]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[AT]]></category>
		<category><![CDATA[Fox Board]]></category>
		<category><![CDATA[GSM]]></category>
		<category><![CDATA[SMS]]></category>

		<guid isPermaLink="false">http://r19649.ovh.net/cs/blog/?p=25</guid>
		<description><![CDATA[J&#8217;ai été amené à travailler dans le cadre de mes études sur un petit projet de développement d&#8217;une Interface GSM sur un système Linux embarqué. Ayant découvert la puissance du système, j&#8217;ai pensé vous faire part de mes découvertes sur l&#8217;utilisation de cette carte.
Dans mon cas le principe était de créer un système autonome d&#8217;envoi [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_24" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-24" title="carte_fox" src="http://r19649.ovh.net/cs/blog/wp-content/uploads/2009/02/acme_fox-300x197.jpg" alt="Carte Fox" width="300" height="197" /><p class="wp-caption-text">Carte Fox</p></div>
<p style="text-align: justify;">J&#8217;ai été amené à travailler dans le cadre de mes études sur un petit projet de développement d&#8217;une Interface GSM sur un système Linux embarqué. Ayant découvert la puissance du système, j&#8217;ai pensé vous faire part de mes découvertes sur l&#8217;utilisation de cette carte.</p>
<p style="text-align: justify;">Dans mon cas le principe était de créer un système autonome d&#8217;envoi de SMS aux étudiants de mon école. L&#8217;idée étant de pouvoir envoyer les résultats des examens directement par SMS aux étudiants, ce qui est ma foi fort sympatique <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2 style="text-align: justify;">Le Matériel</h2>
<p style="text-align: justify;">Alors, tout d&#8217;abord : Carte FOX Késako !? Il s&#8217;agit d&#8217;un système embarqué à bas coût utilisant le système d’exploitation Linux. La carte est dotée d’un processeur AXIS à 100MHz et de 32 MB de RAM, de connectiques USB, Ethernet, d’un port série console ainsi que 40 pins pouvant être reliées à plusieurs BUS de données. Elle permet de développer en bon nombre de langages : C, C++, PHP, PYTHON, Shell, … et permet des connections HTTP, FTP, SSH et TELNET. De petite taille et faible consommation électrique (1 W) est idéale pour mettre en place rapidement des projets de type embarqué.</p>
<p style="text-align: justify;">
<div id="attachment_36" class="wp-caption alignright" style="width: 210px"><img class="size-full wp-image-36" title="gm862-quad" src="http://r19649.ovh.net/cs/blog/wp-content/uploads/2009/02/gm862-quad.jpg" alt="Modem GSM" width="200" height="200" /><p class="wp-caption-text">Modem GSM</p></div>
<p>Le modem GSM utilisé ici est un modem de la marque Telit. Il est relié à la carte FOX par l’intermédiaire d’une carte d’extension. La carte FOX peut communiquer avec le modem par l’intermédiaire du port série /dev/ttyS2. Une simple utilisation de carte SIM classique permet de se connecter au réseau GSM. Il est possible de trouver cette carte seule sur le site d&#8217;<a href="http://foxlx.acmesystems.it/?id=4">ACME SYSTEMS</a> à 176 € frais de port tout compris. Si l&#8217;on ajoute le kit GPRS cela monte jusqu&#8217;à 626 €, ce qui commence déjà à faire beaucoup. Je pense qu&#8217;une solution plus abordable serait de relier la carte basique à un téléphone portable pour communiquer en série étant donné que dans notre cas nous n&#8217;avons pas besoin de tous les éléments de la carte d&#8217;extension.</p>
<p style="text-align: justify;">Les modems GSM utilisent un protocole de commandes appelées &laquo;&nbsp;commandes AT&nbsp;&raquo;. Chaque constructeur fait un peu ce qu&#8217;il veut avec ses normes, ce qui fait que chaque modem est plus ou moins différent et qu&#8217;il faut se référer à la <a href="http://www.telit.com/module/infopool/download.php?id=542">doc du constructeur</a>. Ces commandes AT sont donc envoyées via le port série pour soumettre différentes commandes au modem. On peut notamment dans notre cas manipuler et envoyer des SMS par l’intermédiaire de celles-ci.</p>
<p><span id="more-25"></span></p>
<h2 style="text-align: justify;">Environnement de développement</h2>
<p style="text-align: justify;">La compilation d’un programme en C sur la carte fox nécessite un compilateur croisé permettant de compiler le code C pour les processeurs AXIS. La compilation directe sur la carte n’étant pas possible, il faut par conséquent utiliser un SDK  pour compiler le programme. J&#8217;ai travaillé avec le <a href="http://foxlx.acmesystems.it/?id=5">SDK Axis</a> fourni pour la carte fox.</p>
<p style="text-align: justify;">Avant toute chose il faut se rendre dans le dossier du SDK (~/devboard-R2_01 pour ma part) et y taper la commande suivante afin d’initialiser l’environnement de développement.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p25code93'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2593"><td class="code" id="p25code93"><pre class="shell" style="font-family:monospace;">. init_env</pre></td></tr></table></div>

<p>Ensuite, il faut choisir le compilateur AXIS</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p25code94'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2594"><td class="code" id="p25code94"><pre class="shell" style="font-family:monospace;">make cris-axis-linux-gnu</pre></td></tr></table></div>

<p>On doit alors créer un Makefile pour notre programme. Voici celui que j&#8217;ai créé :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p25code95'); return false;">View Code</a> MAKEFILE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2595"><td class="code" id="p25code95"><pre class="makefile" style="font-family:monospace;">AXIS_USABLE_LIBS=UCLIBC GLIBC
include $(AXIS_TOP_DIR)/tools/build/Rules.axis
PROGS = sms
INSTDIR= $(prefix)/mnt/flash
INSTMODE= 0755
INSTOWNER= root
INSTGROUP= root
OBJS = main.o atcommand.o modem.o
all: $(PROGS)
$(PROGS): $(OBJS)
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
scp sms root@fox01:/mnt/flash/tx
clean:
rm -f *.o
rm -f sms</pre></td></tr></table></div>

<p style="text-align: justify;">Il n’y a alors plus qu’à faire un make pour compiler le programme et à l’envoyer sur la carte en FTP ou SCP. Ayant dû compiler à de très nombreuses reprises mon programme, j’ai rajouté l’envoi du fichier dans le makefile via la commande scp. Les fichiers utilisateurs sont déposés sur la carte Flash dans le répertoire /mnt/flash. Attention toutefois, car la mémoire flash EPROM est limitée en nombre d&#8217;écritures. Il vaut mieux tant que possible éviter d&#8217;écrire dans cette mémoire régulièrement. Privilégier la RAM (dossier /var par exemple) plutôt que sur la carte flash. Seul soucis, la carte se réinitialise à chaque redémarrage, par conséquent les tests peuvent être faits en RAM et une fois que l&#8217;application compilée est stable il est préférable de la déposer sur la carte flash afin de ne pas perdre le programme à chaque reboot.</p>
<p style="text-align: justify;">La connexion à la carte fox se fait en telnet (ou ssh) simplement à l’aide de la commande suivante grâce à un simple telnet</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p25code96'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2596"><td class="code" id="p25code96"><pre class="shell" style="font-family:monospace;">telnet adresse_ip_de_la_fox</pre></td></tr></table></div>

<h2 style="text-align: justify;">Développement du programme</h2>
<h3>Utilisation des commandes AT</h3>
<p style="text-align: justify;">Le modem se commande directement grâce aux commandes AT.  Ces commandes AT suivent une certaine syntaxe et nécessitent une mise en forme particulière pour leur envoi sur le modem. Ce dernier reconnaît plusieurs caractères de contrôle :</p>
<p style="text-align: justify;"><strong>&lt;CR&gt;</strong> : Caractère de retour chariot : Sa valeur ASCII en décimal est fixée à 13 par défaut. (et peut être changée grâce au paramètre AT S3) Sa valeur hexadécimale quant à elle est 0&#215;0D.</p>
<p style="text-align: justify;"><strong>&lt;LF&gt;</strong> : Caractère d’interligne : Sa valeur ASCII en décimal est fixée à 10 par défaut</p>
<p style="text-align: justify;"><strong>&lt;CTRL+Z&gt;</strong> : Combinaison des touches CTRL et Z. Sa valeur hexa est 0&#215;1A</p>
<p style="text-align: justify;">Ces caractères sont demandés et utilisés par le modem pour identifier les commandes AT. Chacune d’entre-elles utilise ces caractères de contrôle plus ou moins différemment. Voici un aperçu des différentes commandes que j’ai utilisées avec leurs caractères de contrôle.</p>
<p style="text-align: justify;"><strong>ATE0&lt;CR&gt;</strong><br />
Cette commande permet de désactiver la commande écho (ATE1 la réactive). Cela demande donc au modem de ne pas répéter systématiquement les commandes qui lui sont envoyées.</p>
<p style="text-align: justify;"><strong>AT+CMGF=1&lt;CR&gt;</strong></p>
<p style="text-align: justify;">Cette commande permet de régler le format de message pour l’envoi de SMS. Par défaut, le modem est en mode PDU (AT+CMGF=0). C&#8217;est-à-dire que l’envoi de message se fait en hexadécimal. AT+CMGF=1 permet de passer en mode texte, ce qui simplifie les manipulations de SMS.</p>
<p style="text-align: justify;"><strong>AT+CMGS=&nbsp;&raquo;06XXXXXXXX&nbsp;&raquo;&lt;CR&gt;</strong></p>
<p style="text-align: justify;">Cette commande permet de commencer la rédaction d’un SMS. On précise en argument le numéro de téléphone choisi. En retour on obtient le caractère d’invite de commande « &gt; » qui nous invite à rentrer le texte du SMS.</p>
<p style="text-align: justify;"><strong>Texte du SMS&lt;CTRL+Z&gt;&lt;CR&gt;</strong><br />
Cette fin de commande permet alors de préciser le texte et de valider l’envoi du SMS par un CTRL+Z et un retour chariot.</p>
<p style="text-align: justify;">Il est important de noter que l&#8217;envoi de la commande AT d&#8217;envoi de SMS se fait en 2 parties et pas en un coup. (j&#8217;ai testé pendant plusieurs semaines&#8230; ça ne marche pas ^^)</p>
<p style="text-align: justify;">Le modem répond à ces commandes par des messages de retour. Ces derniers indiquent si celles-ci ont été exécutées avec succès ou non. La plupart de ces réponses sont entourées des caractères <strong>&lt;CR&gt;&lt;LF&gt;</strong> Il y a toutefois des exceptions, notamment pour <strong>AT+CMGS</strong> qui renvoie <strong>+CMGS: &lt;mr&gt;</strong> ou <strong>+CMS ERROR: &lt;err&gt;</strong> Mais dans la plupart des cas les retours sont rapportés de la manière suivante :<br />
<strong>&lt;CR&gt;&lt;LF&gt;OK&lt;CR&gt;&lt;LF&gt;<br />
&lt;CR&gt;&lt;LF&gt;ERROR&lt;CR&gt;&lt;LF&gt;<br />
&lt;CR&gt;&lt;LF&gt;&#8230;&lt;CR&gt;&lt;LF&gt;</strong></p>
<p style="text-align: justify;">Ces commandes AT doivent être transmises au modem par le port série /dev/ttyS2. Il existe plusieurs façons de communiquer sur le port série :</p>
<p style="text-align: justify;"><strong>Termnetd</strong> (<a href="http://foxlx.acmesystems.it/?id=69">http://foxlx.acmesystems.it/?id=69</a>)</p>
<p style="text-align: justify;">Il s’agit d’un processus permettant de relier un port TCP/IP à un port série de manière transparente. Une fois que le deamon est lancé sur la carte fox, il est possible de se connecter depuis l’extérieur grâce à la commande telnet adress_ip_fox 7000. Le port 7000 (choisi dans la config de termnetd) redirige directement sur le port série et il est alors possible de rentrer manuellement des commandes AT et de voir leur comportement direct sur le modem. Ce programme est utile pour comprendre le fonctionnement des commandes AT.</p>
<p style="text-align: justify;"><strong>Script Chat</strong> (<a href="http://linux.about.com/od/commands/l/blcmdl8_chat.htm">http://linux.about.com/od/commands/l/blcmdl8_chat.htm</a>)<br />
Il est possible d’utiliser la commande UNIX chat permettant de dialoguer de manière automatisée avec le modem.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p25code97'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2597"><td class="code" id="p25code97"><pre class="shell" style="font-family:monospace;">/usr/sbin/chat -V -s -f &lt;fichier_script&gt; &gt; /dev/ttyS2 &lt; /dev/ttyS2 2&gt;&lt;fichier_resultat&gt;</pre></td></tr></table></div>

<p style="text-align: justify;">La réponse du modem est alors enregistrée dans le fichier de résultat choisi.</p>
<p style="text-align: justify;"><strong>Programme en C</strong><br />
Il est également possible de dialoguer avec le modem via un programme C. Le dialogue se fait alors en écrivant et en lisant sur /dev/ttyS2. La prise en main est beaucoup plus complexe que les 2 précédentes méthodes, mais permet une totale maitrise du modem.</p>
<h3 style="text-align: justify;">Développement en C</h3>
<p style="text-align: justify;">Le code pour envoyer un SMS n&#8217;est pas bien compliqué, mon but n&#8217;est pas là de copier/coller intégralement mon code, mais plutôt d&#8217;expliquer les grandes lignes son fonctionnement et de vous donner envie de bidouiller une carte fox ^^</p>
<p style="text-align: justify;">L&#8217;idée est donc d&#8217;initialiser tout d&#8217;abord la connexion série à l&#8217;aide de Termios. La documentation sur le site du constructeur regorge d&#8217;informations et propose du <a href="http://foxlx.acmesystems.it/foxlx_acmesystems_it/00035/serial_test.c">code tout fait</a> pour gérer la connexion série. Une fois la configuration réalisée (c&#8217;est très rapide à réaliser), il n&#8217;y a plus qu&#8217;à faire un write sur /dev/ttyS2</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p25code98'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2598"><td class="code" id="p25code98"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> command1<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">50</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> command2<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">50</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
sprintf<span style="color: #009900;">&#40;</span>command1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;AT+CMGS=&quot;</span><span style="color: #339933;">%</span>s<span style="color: #ff0000;">&quot;x0D&quot;</span><span style="color: #339933;">,</span> number<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
sprintf<span style="color: #009900;">&#40;</span>command2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%sx1Ax0D&quot;</span><span style="color: #339933;">,</span> text<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
write <span style="color: #009900;">&#40;</span>tty_fd<span style="color: #339933;">,</span> command1<span style="color: #339933;">,</span> strlen<span style="color: #009900;">&#40;</span>command1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
sleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// attend la réponse du modem afin d'envoyer la seconde partie</span>
write<span style="color: #009900;">&#40;</span>tty_fd<span style="color: #339933;">,</span>command2<span style="color: #339933;">,</span>strlen<span style="color: #009900;">&#40;</span>command2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Et le SMS est envoyé ! Après libre à vous de rajouter à la suite une lecture de la réponse du modem (gentil petit read). Dès lors il est possible de se faire une petite fonction d&#8217;envoi de SMS à partir d&#8217;arguments tels que le numéro de téléphone et le texte du message. J&#8217;en ai profité pour me rajouter un système de logs et de manipulation du modem (redémarrage, arrêt). Je me suis créé une interface web en bash (scripts cgi) et par simples appels de notre programme C il est alors possible de se construire une application métier complexe. On a plus qu&#8217;à brancher notre carte fox sur le réseau et celle-ci peut envoyer des SMS à distance de manière assistée grâce à des formulaires web !</p>
<h2 style="text-align: justify;">Préparation de la carte FOX</h2>
<p style="text-align: justify;">Dernier point de précision: au démarrage, le modem n’est pas allumé ni configuré. Il faut par conséquent créer un script de démarrage à déposer dans /etc/init.d/boottime . Voici le script que j&#8217;ai utilisé:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p25code99'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2599"><td class="code" id="p25code99"><pre class="shell" style="font-family:monospace;">#!/bin/sh
# démarrage du modem
setbits -p b -b 7 -s 1
# Lancement de termnetd (pour les tests)
/mnt/flash/termnetd
# Initialisation série du modem (mon petit programme d’initialisation de la connexion série)
/mnt/flash/tx/sms -init
sleep 20
# Initialisation AT du modem
/usr/sbin/chat -V -s -f /mnt/flash/tx/scripts/scriptAT.chat &gt;
/dev/ttyS2 &lt; /dev/ttyS2 2&gt; /mnt/flash/tx/scripts/scriptAT_result.txt
# Ecriture des logs (pour le fun ^^)
echo “`date` : MODEM start” &gt;&gt; /mnt/flash/tx/log/fox.log</pre></td></tr></table></div>

<p style="text-align: justify;">On commence par allumer le modem, on initialise la connexion série avec le programme en C puis attend 20 secondes que le modem soit identifié sur le réseau. Le temps choisi est totalement arbitraire. Cela semble fonctionner correctement avec cette période, mais idéalement il serait intéressant d’interroger le modem pour déterminer s’il est bien connecté au réseau. Ensuite on exécute un script chat que voici :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p25code100'); return false;">View Code</a> SCRIPT_CHAT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p25100"><td class="code" id="p25code100"><pre class="script_chat" style="font-family:monospace;">ABORT BUSY
ABORT 'NO CARRIER'
ABORT ERROR
'' AT
OK ATZ
OK 'ATE0'
OK 'AT+CMGF=1'
OK ''</pre></td></tr></table></div>

<p style="text-align: justify;">Ce dernier permet de désactiver l’écho afin de ne pas recevoir mes commandes en double, et permet d’activer le mode texte pour l’envoi de SMS. Par défaut l’envoi de SMS se fait en mode PDU (sous forme hexadécimale), ce qui est bien plus compliqué à utiliser. Une fois ce script exécuté, le modem est prêt à être utilisé. On peut rajouter un log à la fin pour identifier le démarrage du modem.</p>
<p style="text-align: justify;">La carte fox est une carte embarqué assez simple à prendre en main, les utilisations sont assez illimités. Le rêve de tout bidouilleur !<br />
Je songe à m&#8217;en commander une très bientôt, je ne peux pas résister à tant de potentiel de bidouille.</p>
<p style="text-align: justify;">A suivre : Comment connecter la carte fox au réseau GPRS pour pouvoir aller sur le net et envoyer des mail <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/interface-gsm-sur-systeme-linux-embarque/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
