Aller au menu - Aller au contenu

Icône Personnalisez votre shell

Avatar
Par Avatar ren0
Mise à jour : 28/08/2010
Difficulté : Facile Facile
144 visites depuis 7 jours, classé 486/786
Bonjour à tous !

Après avoir vu comment rendre un peu de gaieté et de couleur à votre shell bash dans le tutoriel Personnalisez votre shell en couleur ! avec utb_diablo, nous allons aujourd'hui voir quelques petites astuces permettant de pousser la personnalisation un peu plus loin : ce tutoriel se veut complémentaire avec celui de utb_diablo.

On va ainsi voir comment ajouter des informations additionnelles dans l'invite de commande, comment créer un alias ou encore comment modifier la valeur de la variable d'environnement $PATH.

La théorie

Comme toujours, on va un peu parler de théorie avant de passer à la pratique, histoire de bien comprendre ce qu'on fait. Nous allons donc voir les outils qui s'offrent à nous afin de personnaliser notre shell. Notons bien que chaque utilisateur de votre système pourra personnaliser son shell comme il l'entend.

Le shell


Un shell est un logiciel fournissant une interface pour utilisateur, le plus souvent en ligne de commande. Il est donc un interpréteur de commandes et offre la possibilité d'interagir avec la machine.

On interagit donc avec le système au moyen du shell, au travers de la console ou bien d'un terminal graphique qui est une émulation de cette dernière.

Historiquement, le premier shell utilisé sous les systèmes d'exploitation de type UNIX était le bourne shell (sh) qui a évolué en d'autres versions plus performantes. Parmi les shells utilisés aujourd'hui, on rencontre
  • Almquist SHell (ash)
  • Bourne-Again SHell (bash)
  • C SHell (csh)
  • Korn SHell (ksh)
  • Tenex C SHell (tcsh)
  • etc.
Dans notre cas, nous utiliserons l'interpréteur de commandes bash, il est en effet le plus utilisé sur les systèmes GNU/Linux, il est rapide, simple et puissant.

Configuration de bash


Le paramétrage de notre shell bash se passe au niveau de son fichier de configuration : .bashrc.

Le point indique que le fichier est masqué, il suffit de lancer ls -a pour qu'il révèle sa présence. Ce fichier, qui se situe dans votre répertoire personnel, est lu et exécuté par bash à chaque fois que ce dernier est lancé de façon interactive, i.e. via l'ouverture d'un terminal. Si vous vous loggez en console, c'est le fichier .bash_profile, également situé dans votre répertoire personnel, qui sera lu et exécuté.

Voici un aperçu d'un .bashrc très simple

Code : Console
# Check for an interactive session
[ -z "$PS1" ] && return

alias ls='ls --color=auto'
PS1='[\u@\h \W]\$ '

Il y a deux choses importantes à noter dans ce fichier, la ligne parlant d'alias ainsi que celle commençant par PS1.

Les aliases


Les aliases (pluriel de alias) sont des façons alternatives de dénommer quelqu'un ou quelque chose, au sens où tout le monde l'entend. Il n'est pas rare d'entendre l'expression AKA (pour "also known as" qui signifie "également connu comme [étant]") dans le langage courant.

Dans notre cas, c'est exactement la même chose. On fera référence à une commande en employant en pseudonyme, en quelque sorte.
Vous pouvez vous demander l'utilité d'une telle méthode, nous allons la voir immédiatement au travers d'un exemple.

Supposons que vous ayez à exécuter une commande quelques fois (si ce n'est qu'une fois, effectivement ça ne sert à rien); comme par exemple vous connecter à un serveur distant en utilisant le protocole SSH. Vous devez naturellement exécuter la commande basique suivante

Code : Console
ssh utilisateur@serveurdistant


Même si ce n'est pas très contraignant, certaines commandes sont parfois beaucoup plus longues. On aimerait bien pouvoir les exécuter de façon plus rapide. C'est là que les aliases interviennent. On peut faire référence à cette commande à l'aide d'un alias, qu'on saisira en lieu et place de la commande initiale.

Ainsi, si on choisit l'alias "server" pour la commande ci-dessus, on lancera

Code : Console
server


et bash comprendra qu'on fait référence à la commande de connexion à notre serveur et l'exécutera, en conséquence. C'est assez pratique si on veut avoir à éviter de taper chaque fois une commande.

La variable d'environnement $PS1


La variable d'environnement $PS1 est affichée à chaque ligne de commande tapée, il s'agit du prompt de base :

Code : Console
[renaud@renaud-laptop ~]$


Typiquement, cette variable donne des informations importantes, elle affiche : [utilisateur@machine répertoireCourant]privilège dans ce cas-ci.

Nous verrons en partie pratique comment modifier la valeur de la variable $PS1, avec les conséquences que ça aura sur notre invite de commande. Nous pourrons notamment afficher la date, notre position actuelle dans l'arborescence (plus uniquement le répertoire courant) ainsi qu'une foule d'autres informations.

La variable d'environnement $PATH


Cette variable recense les répertoires où sont situés les exécutables que le shell lance lorsque vous lui adressez une commande. Ainsi, si vous voulez lister le contenu d'un répertoire, vous lancerez basiquement la commande ls.

Bash ira consulter le contenu de la variable $PATH et ira chercher l'exécutable dans un des répertoires listés. Bien souvent, les commandes basiques sont situées dans /bin, /usr/bin, /usr/sbin : c'est le cas de la commande ls. Ces répertoires doivent donc être renseignés dans votre variable $PATH.

Notons que bash ira chercher la commande dans les répertoires dans l'ordre précisé.

Ainsi, si vous voulez exécuter la commande dhcpcd qui se situe au sein du répertoire /sbin et que votre variable $PATH contient, dans l'ordre, les répertoires /bin, /usr/bin, /sbin, bash tentera d'abord d'aller chercher l'exécutable associé dans /bin. Voyant qu'il ne s'y trouve pas, il passera au répertoire cible suivant : /usr/bin. Vu qu'il n'y est pas non plus, il finira par scanner le répertoire /sbin, au sein duquel il trouvera l'exécutable approprié.

Cette variable nous évite d'avoir à préciser systématiquement le chemin absolu entier vers la commande. On peut donc lancer ls à la place de /bin/ls, même si ça aurait fonctionné aussi bien.

Avant toute manipulation, pensez à sauvegarder le contenu de votre fichier .bashrc, on ne sait jamais.

Configurez la variable $PS1

Modification de la variable $PS1


On va ici s'intéresser à la variable $PS1 qui définit la façon dont le shell s'adresse à nous.
Observons donc le contenu de ma variable $PS1 et décortiquons-le.

Code : Console
[renaud@renaud-laptop ~]$ echo $PS1
[\u@\h \W]\$


Comme vous le voyez, les crochets sont affichés en tant que tel, mais ce qui est précédé d'un backslash "\" est interprété. Ce n'est pas plus compliqué que ça.
Voici un petit tableau qui recense quelques valeurs à passer ainsi que leurs conséquences

CombinaisonEffet
\u nom de l'utilisateur courant
\h nom de la machine
\W nom du répertoire courant
\$ privilège de l'utilisateur courant
\d date courante (au format lun. janv. 1)
\w chemin complet du répertoire de travail
\A heure format 24h sans les secondes
\t heure format 24h avec les secondes
\@ heure format 12h sans les secondes
\T heure format 12h avec les secondes
\D{%d-%m-%Y %H:%M:%S%z} Date et heure dans un format personnalisable
\j nombre de tâches en cours dans le terminal
\# numéro de la commande dans l'historique
\v version de bash
\n nouvelle ligne

Tableau recensant les diverses valeurs et les effets associés

Comme vous le voyez, il y a toute une panoplie de valeurs qui peuvent être passées à la variable $PS1. À vous de trouver ce qui vous convient le mieux. Vu la multitude de combinaisons différentes à réaliser, vous avez le choix !

En plus de ça, on peut même passer du texte pour que notre shell nous dise ce qu'on a envie. Il suffit pour cela d'inscrire le texte entre guillemets (simples ou doubles, ça ne change rien).

Une ambiguïté doit être levée. Si vous remarquez bien, ma variable $PS1 contient les caractères \u@ et le tableau \u et \@. Il faut prendre garde au fait que le @ dans ma variable n'est pas interprété, il est affiché comme tel, pour signifier "chez". Si j'avais fait précéder le @ d'un backslash, il aurait été interprété et aurait eu la conséquence détaillée dans le tableau ci-dessus.

On va voir 2 exemples pour un peu voir comment ça fonctionne, ensuite on verra comment les appliquer en pratique.

Supposons que vous souhaitiez que votre shell vous dise bonjour, quelle heure il est et vous demande de lancer une commande, vous remplirez votre variable $PS1 comme ceci

Code : Console
'bonjour \u il est \t , lance une commande :'


qui produira le résultat suivant :

Code : Console
bonjour renaud il est 16:48:14 , lance une commande :


Si vous souhaitez plutôt que votre shell vous dise la date, l'heure et votre position actuelle dans l'arborescence des fichiers, vous remplirez votre variable avec ceci

Code : Console
'\u, nous sommes le \d, il est \t , et tu te situes en \w'


qui produira le résultat suivant

Code : Console
renaud, nous sommes le sam aoû 28, il est 16:53:59 , et tu te situes en ~


Notez bien que le tilde ~ signifie que je me situe dans mon répertoire personnel.

Comment modifier le contenu de la variable $PS1 ?


C'est très simple, si vous voulez modifier votre configuration, en choisissant un format Nom_d'utilisateur@Nom_de_la_machine heure>, alors vous ferez

Code : Console
export PS1="\u@\h \A> "


Ce changement est cependant temporaire, c'est-à-dire que quand vous relancerez bash, le contenu de .bashrc sera à nouveau lu et exécuté, rendant inutiles les modifications précédentes. Pour rendre les changements permanents, ouvrez votre fichier .bashrc avec votre éditeur préféré et repérez la ligne commençant par PS1=...

Ensuite, modifiez cette ligne de façon appropriée pour que vos changements soient pris en compte à l'avenir.

Configurez la variable $PATH

Nous allons maintenant nous attacher à modifier le contenu de cette fameuse variable !
Commençons par afficher ce qu'elle contient, via la commande

Code : Console
echo $PATH


Vous devriez voir apparaître les chemins absolus vers les répertoires listés dans la variable $PATH.
Nous l'avons vu, lorsque vous exécutez une commande, le shell va chercher les exécutables dans les dossiers listés dans leur ordre d'apparition. Que faire alors, si une commande n'est pas unique, ou si le shell renvoie l'erreur "command not found" ?

Nous l'avons vu, pour lancer une commande, on peut
  • l'appeler par son nom (ls)
  • l'appeler via son chemin absolu (/bin/ls)
  • l'appeler via son chemin relatif (../../bin/ls)
Plaçons nous dans le cas d'une commande multiple. Ça peut arriver, par exemple, si vous installez une version plus récente et que vous installez l'exécutable à un autre endroit que celui prévu initialement.
Dans ce cas, soit vous modifiez l'ordre des répertoires dans votre variable $PATH, soit vous entrez le chemin complet vers la commande.

Plaçons nous maintenant dans le cas d'un "command not found" en supposant que la syntaxe de la commande soit correcte. C'est alors que le répertoire contenant l'exécutable n'est pas renseigné.

Comment modifier le contenu de la variable $PATH ?


Si vous voulez ajouter le répertoire /home/foo/program en dernier, on fera

Code : Console
export PATH=$PATH:/home/foo/program


Si on veut l'ajouter en premier, on fera

Code : Console
export PATH=/home/foo/program/:$PATH


Notez que ces changements ne sont valables uniquement que pour la session en cours, lorsque vous relancerez bash, $PATH reprendra la valeur par défaut.

Pour y remédier, on va tout simplement modifier le contenu de notre .bashrc en utilisant les flux de redirection, qui permettront d'écrire dans le fichier. Si vous voulez ajouter /home/foo/program en dernier, de façon permanente, vous ferez

Code : Console
echo 'export PATH=$PATH:/home/foo/program' >> /home/user/.bashrc


Remarquez l'importance des deux chevrons fermant ">>" qui permettent d'ajouter le résultat de la commande les précédant à la fin du fichier cible. Si vous n'en mettez qu'un seul, le contenu du fichier sera écrasé. Prudence donc !

Créez vos aliases

Comme expliqué en théorie, les aliases sont très pratiques pour nous simplifier la vie. On va voir au travers d'un exemple comment s'en servir.

Supposons que nous voulions afficher le contenu d'un dossier, y compris les fichiers cachés, avec un format des noms de fichiers long et rendu facilement compréhensible pour les humains. Nous ferons

Code : Console
ls -alh /dossier


ce qui peut ennuyer certains s'ils doivent l'exécuter plusieurs fois. Créons donc un alias, que nous appellerons arbitrairement (appelez-le comme vous voulez) llf (pour list long format).

Il est évident que ce n'est pas une bonne idée d'utiliser un alias déjà existant. Ainsi, ne renommez pas votre commande man ou ifconfig, par exemple. En réalité, si vous faisiez cela, c'est l'alias que vous avez créé qui serait pris en considération, non plus la commande au sens courant.


Allons-y, créons notre alias. Cela se fait via la commande suivante

Code : Console
alias llf='ls -alh'


Désormais, lorsque nous saisirons llf à l'invite de commande, bash comprendra qu'il s'agit d'un alias qui pointe vers ls -alh.

Vous en avez l'habitude maintenant, vous savez bien que nos aliases ne sont valables que pour la session courante. Il suffit de les ajouter au .bashrc avec votre éditeur de texte favori.

Donnez vie à votre terminal avec Cowsay

Enfin, nous allons voir un petit programme qui permet d'ajouter un peu de gaieté à votre shell, il s'agit de cowsay.

Il s'agit d'un petit utilitaire qui permet de générer des dessins en ASCII que vous pourrez utiliser pour décorer votre invite de commande. À la base, le programme est censé faire uniquement "des vaches qui parlent", d'où le nom cowsay, mais on peut créer soi-même ses images !

Vous pourriez ainsi décider d'opter pour une image de Bart Simpson, comme M@teo21 dans son tutoriel reprenez le contrôle avec GNU/Linux.

Image utilisateur

Bart sur un serveur du site du zéro


Nous allons commencer par installer le programme. Lancez donc votre gestionnaire de paquetages avec pour cible "cowsay". On fera par exemple, sous Debian

Code : Console
# aptitude install cowsay


Maintenant, il va falloir vous rendre dans votre fichier .bashrc, comme d'habitude. Il faut l'éditer pour choisir la créature qui apparaîtra et ce qu'elle dira. Pour cela, rajoutez une ligne du type

Code : Console
echo $texteAReciter | cowsay -f /usr/share/cowsay/file.cow


où vous remplacerez $texteAReciter par ce que vous souhaitez que la créature dise et file.cow par le fichier correspondant à la créature voulue.

Si vous voulez ajoutez vos créations personnelles ou des créations trouvées sur l'Internet, c'est possible, il suffit de les placer dans le répertoire /usr/share/cowsay.
Voila, le cours est désormais terminé.

Vous devriez avoir un shell qui affiche toutes les informations que vous aurez jugé utile d'afficher et un peu plus personnalisé que ce qu'on vous propose par défaut.

En espérant que ce tutoriel vous ait plu/aidé, je suis disponible par MP pour toute remarque/question !

Partager

5 commentaires pour "Personnalisez votre shell"
Note moyenne : 2.67 / 4 (21 votes)
Pseudo Commentaire
Hors ligne Vincent Giersch # Posté le 28/08/2010 à 19:59:56
Avatar

Avis : Décevant

Ville : Nantes
Pays : France métropolitaine
Études : Epitech Nantes

Tout ça pour ça.... qui se résume (et plus encore) en man bash. En plus le titre du tuto aurait été plutôt « Personnalisez votre bash ».

Vincent Giersch, Epitech Nantes Promotion 2014
BSD Associate Certified | Google Analytics Individual Qualified | Google Adwords Individual Qualified
 
Hors ligne Yno # Posté le 28/08/2010 à 20:55:25
Avatar
Flux RSS

Salut,

Hum je vois que Vincent a déjà un peu dit ce que je voulais dire, à savoir que c'est principalement un tuto pour personnaliser son prompt avec bash, mais pas vraiment son shell (je fais quoi si j'utilise zsh ?).

Sinon deux critiques rapides en ce qui concerne le contenu :
  • je n'ai lu nul part que tu informais explicitement que les deux points permettaient de séparer les répertoires dans $PATH par exemple ;
  • /home/user/.bashrc ou comment tromper le lecteur ; puisque tu leur as présenté la variable d'environnement $PATH, pourquoi pas $HOME et son raccourci ~ ?
 
Hors ligne Aurenae # Posté le 29/08/2010 à 17:50:39
God is wearing black
Avatar
Groupe : Bannis

Exellent...

Le pouvoir de l'argent fera le désespoir des hommes.... :(
Je ne désespère pas qu'ils trouvent ce à quoi mon cœur a toujours aspiré.
Mais cette paix est un trop grand trésor pour eux, ils devront passer par la haine et son fléau de guerre.
Et sans aucun doute par la douleur.
Aurenae
 
Hors ligne Night / Sun # Posté le 30/08/2010 à 10:26:57
Avatar

hann, je suis déçu...

un peu sur la faim comme ci-dessus...

Le plus restant ton avatar... je pensais que tu étais sous open... :)

sinon tu pourrai aborder l'automatisation de taches... les squelettes pour la création d'user...

bref oui le sujet peut être interressant mais dois faire mieux que man bash :)

curagiù
Hors ligne Aquarius # Posté le 21/01/2011 à 15:52:21
Indexed Sequential Access Meth
Avatar

Excellent tutoriel toutefois la personnalisation n'est pas aussi grande que cela , tu aurais pu parler de la commande stty qui permet de changer les caractéristiques du terminal.
 

Voir tous les commentaires