mageekblog - Mot-clé - bashLe blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.2021-12-02T08:20:54+01:00Frédéric Hardyurn:md5:26874ca5b8cd4cac8d08b0e68e64f63aDotclearInstaller la complétion bash sous Mac OS X et autres astucesurn:md5:6014cbccd8f132326f78cde6d53142a42011-09-01T14:30:00+02:002011-09-01T15:36:30+02:00mageekguyMac OS XbashcomplétioncURLFreeBSDhistoriqueMac OS XPHP<p>Depuis des années, j'ai en permanence au moins un terminal actif, et ce n'est pas mon <q>switch</q> de <a href="http://www.freebsd.org">FreeBSD</a> à <a href="http://www.apple.com/fr/macosx/">Mac OS X</a> qui a changé mon comportement à ce niveau, bien au contraire.</p>
<p>C'est une habitude ancienne, qui remonte à ma formation universitaire et à ma découverte d'<a href="http://fr.wikipedia.org/wiki/UNIX">UNIX</a>, et qui ne m'a jamais quitté, malgré le fait que je suis un fan des interfaces graphiques.</p>
<p>La ligne de commande est en effet dans la majorité des cas un outil bien plus efficace qu'une interface graphique pour les tâches courantes.</p>
<p>De plus, c'est bien souvent le seul moyen permettant d'accéder aux arcanes du système d'exploitation, afin de modifier son comportement, l'optimiser ou le corriger.</p>
<p>L'utilisation de la ligne de commande permet également de comprendre le fonctionnement du système, car elle oblige son utilisateur à lire la documentation et à comprendre ce qu'il fait, car il n'y a aucune couche intermédiaire, telle que l'interface graphique, entre lui et la machine.</p>
<p>Enfin, le terminal est très utile pour le développement en <a href="http://www.php.net">PHP</a>, et ce n'est pas certainement pas l'ajout d'un serveur <abbr title="HyperText Transfer Protocol"><a href="http://fr.wikipedia.org/wiki/Http">HTTP</a></abbr> en <a href="http://blog.mageekbox.net/?post/2011/07/05/Test-du-serveur-http-int%C3%A9gr%C3%A9-%C3%A0-PHP-5.4">ligne de commande dans PHP 5.4</a> et les améliorations apportées à sa console qui me fera abandonner cette habitude.</p>
<p>Cependant, la ligne de commande peut être rébarbative, notamment si l'interface qui permet de communiquer avec le système d'exploitation dans le cadre d'un terminal, <abbr title="Also Known As">aka</abbr> le <a href="http://fr.wikipedia.org/wiki/Shell_(informatique)">shell</a>, n'est pas correctement configuré.</p>
<p>Or, l'interface de commandes par défaut de <a href="http://www.apple.com/fr/macosx/">Mac OS X</a>, <abbr title="Also Known As">aka</abbr> <a href="http://fr.wikipedia.org/wiki/Bourne-Again_shell">bash</a>, est plutôt frustre dans sa version de base, notamment en ce qui concerne la complétion des commandes via la touche ⇥.</p> <p>En effet, même si <a href="http://fr.wikipedia.org/wiki/Bourne-Again_shell">bash</a> propose de base une complétion, elle est plutôt limitée et il faut donc utiliser un script complémentaire, connu sous le nom de <q><a href="http://bash-completion.alioth.debian.org/">bash completion</a></q>, pour pouvoir travailler réellement confortablement.</p>
<p>Il est possible de trouver sur Internet tout un tas de tutoriaux pour installer la complétion améliorée de bash sous <a href="http://www.apple.com/fr/macosx/">Mac OS X</a>, mais ils font pour la plupart appel à un système de paquet.</p>
<p>Or, je n'utilise aucun d'eux car je n'en ai pas l'utilité et qu'en bon agiliste, je ne met en œuvre que le strict minimum qui m'est nécessaire pour travailler.</p>
<p>Et comme installer un gestionnaire de paquets me paraissait un tantinet exagéré pour obtenir la complétion dans <a href="http://fr.wikipedia.org/wiki/Bourne-Again_shell">bash</a>, j'ai décidé de réaliser l'installation manuellement.</p>
<p>Il faut commencer par <a href="http://bash-completion.alioth.debian.org/#download">télécharger</a> la dernière version de la complétion, via bien évidemment un terminal et l'instruction qui suite :</p>
<blockquote><pre><code># curl -O http://bash-completion.alioth.debian.org/files/bash-completion-1.3.tar.bz2</code></pre></blockquote>
<p>En effet, avant d'être une <a href="http://fr2.php.net/curl">extension</a> de <a href="http://www.php.net">PHP</a> très utile, <a href="http://fr.wikipedia.org/wiki/CURL">cURL</a> est surtout un client <abbr title="HyperText Transfer Protocol"><a href="http://fr.wikipedia.org/wiki/Http">HTTP</a></abbr> en ligne de commande, et en conséquence, il permet la récupération de fichiers stockés sur le web.</p>
<p>L'option -0 de <code>curl</code> permet de récupérer l'archive dans le répertoire courant dans un fichier portant le nom <code>bash-completion-1.3.tar.bz2</code>.</p>
<p>Il faut ensuite, toujours via le terminal, décompresser l'archive ainsi obtenue :</p>
<blockquote><pre><code># tar xzpf !$:t</code></pre></blockquote>
<p>Les lecteurs avertis auront remarqué que le nom de l'archive à décompresser n'apparait pas dans la commande précédente.</p>
<p>Elle est en effet remplacée par la chaîne de caractères <code>!$:t</code> qui permet d'utiliser l'historique afin de ne pas avoir à la longue le bout des doigts carré en tapant plusieurs fois les mêmes choses.</p>
<p>Le symbole <code>!</code> débute une substitution de l'historique, tandis que <code>$</code> permet de récupérer le dernier argument de la dernière instruction exécutée et que <code>:t</code> permet de ne conserver que son nom de fichier final.</p>
<p><span class="Apple-style-span">Il est à noter que suivant la valeur de l'option <code>histverify</code>, </span><a href="http://fr.wikipedia.org/wiki/Bourne-Again_shell">bash</a><span class="Apple-style-span"> vous permettra éventuellement de vérifier que la substitution s'est passée correctement en affichant l'instruction résultante, auquel cas vous devrez appuyer sur la touche ↵ de votre clavier pour exécuter effectivement la commande.</span></p>
<p>Une fois l'archive décompressée, il n'y a plus qu'à réaliser l'installation, en commençant par aller dans le répertoire contenant le code de la complétion via l'exécution de la commande suivante :</p>
<blockquote><pre><code># cd !$:r:r</code></pre></blockquote>
<p>Encore une fois, la commande précédente fait appel à la substitution d'historique.</p>
<p>La chaîne de caractère <code>!$</code> permet toujours de récupérer le dernier argument de la commande précédente, mais le modificateur <code>:r</code> le modifie deux fois en lui retirant successivement les extensions <q>.bz2</q> et <q>.tar</q>.</p>
<p>Il n'y a plus ensuite qu'à lancer l'installation proprement dite, toujours en ligne de commande, à l'aide des instructions suivantes :</p>
<blockquote><pre><code># ./configure
# make
# sudo !! install</code></pre></blockquote>
<p>L'utilisation de <code>!!</code> dans la suite d'instruction précédente permet de récupérer dans l'historique des commandes la dernière commande exécutée dans son intégralité.</p>
<p>Cette substitution est d'ailleurs particulièrement utile lorsque l'on a voulu exécuter une instruction requérant les droits du super-utilisateur sans utiliser <code>sudo</code>, puisqu'un simple <code> sudo !!</code> permet d'exécuter une nouvelle fois la commande avec les bons droits sans avoir à la retaper dans son intégralité.</p>
<p><span class="Apple-style-span">Les scripts nécessaires à l'utilisation de la complétion dans </span><a href="http://fr.wikipedia.org/wiki/Bourne-Again_shell">bash</a><span class="Apple-style-span"> sont donc maintenant installés.</span></p>
<p><span class="Apple-style-span">Cependant, </span><a href="http://www.apple.com/fr/macosx/">Mac OS X</a><span class="Apple-style-span"> ne respecte pas l'arborescence de fichiers requise par les scripts pour qu'ils fonctionnent correctement, et il est donc nécessaire d'ajouter quelques lignes de configuration dans le fichier <code>~/.bashrc</code> pour pallier à ce problème, à l'aide des instructions suivantes :</span></p>
<blockquote><pre><code># echo 'BASH_COMPLETION=/usr/local/etc/bash_completion' >> ~/.bashrc
# !!:s/TION/TION_DIR/:s/tion/tion.d
# !!:s/_DIR/_COMPAT_DIR
</code></pre></blockquote>
<p>Encore une fois, l'historique est mis à contribution pour ne pas avoir à retaper la majorité du contenu des instructions à chaque fois.</p>
<p>La chaîne de caractères <code>!!</code> permet toujours de récupérer dans l'historique la dernière commande exécuter, tandis que <code>:s</code> est un modificateur qui permet d'effectuer un <q>chercher/remplacer</q> dans l'instruction récupérée.</p>
<p>Ainsi, dans notre cas, <code>s/TION/TION_DIR TION</code> et <code>:s/tion/tion.d</code> remplace respectivement <q>TION</q> par <q>TION_DIR</q> et <q>tion</q> par <q>tion.d</q>.</p>
<p>Et dans le cas de la dernière instruction, <code>:s/_DIR/_COMPAT_DIR</code> permet de remplacer <q>_DIR</q>, ajouté lors de la substitution effectuée sur la première instruction pour générer la seconde instruction, par <q>_COMPAT_DIR</q>.</p>
<p>Une fois tout cela effectué, il ne vous reste plus qu'à lancer un nouveau terminal pour profiter des nouvelles capacités de complétion de bash.</p>http://blog.mageekbox.net/?post/2011/09/01/Installer-la-compl%C3%A9tion-bash-sous-Mac-OS-X-et-autres-astuces#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/289