Bash : personnalisation de l'invite.
Cet article a été publié par Xenom
le 06-02-09 à 12:14 dans la catégorie Trucs - Astuces
Tags :
- EeePC
- Libre
- TrucsAstuces
- Tutoriel
- Ubuntu
Le terminal sous GNU/Linux est très pratique et pouvoir le personnaliser, pour être plus efficace et qu'il soit à son gout, c'est quand même mieux.
Plusieurs articles ont déjà parlé du terminal et je vais donc vous montrer comment personnaliser l'invite de commande.
L'invite est le texte qui est présent dans le terminal avant chaque commande. Celui par défaut ressemble à celle la:
[xenom@nomdemachine ~]$
Avec entre crochets le nom d'utilisateur@le nom de la machine, un espace et le dossier courant. Puis un "$" montrant que vous êtes connecté en utilisateur normal. Si vous êtes connecté en tant que root ce ne sera plus "$" mais "#".
Comment personnaliser cette invite ?
La variable d'environnement PS1 permet de définir le format de l'invite.La variable PS2 permet de modifier l'invite de continuation (celle qui apparait quand le shell attend d'autres instructions, par defaut ">").
Pour la mise en forme nous disposons de caractères spéciaux :
L'invite par défaut a cette forme : [\u@\h \W]\$
- \u : nom de l'utilisateur.
- \h : nom de la machine.
- \W : nom du dossier courant.
- \$ : affiche $ pour un utilisateur et # pour root.
En voici d'autres :
- \w : chemin complet du répertoire de travail.
- \d : date format texte ("sam. janv. 31").
- \A : heure format 24h sans secondes.
- \t : heure format 24h avec les secondes.
- \T : heure format 12h avec les secondes.
- \@ : heure format 12H sans secondes.
- \D{%d-%m-%Y %H:%M:%S%z} : Date et heure dans un format personnalisable (ici jour-mois-année sur 4 chiffres heure:minute:seconde fuseau horaire).
/!\ Attention la date et l'heure sont celles lors de l'apparition du prompt! L'heure ne défile pas!
- $? : code de retour de la dernière commande (0 si OK, 1 si erreur).
- `commande_ou_fonction` : lance la commande ou fonction.
- \j : nombre de tache en cours dans le terminal (pratique si vous lancez des tâches en arrière plan).
- \# : le numéro de la commande.
- \v : version de bash.
- \n : nouvelle ligne.
Et maintenant la couleur!
On peut mettre en couleur l'invite et les commandes qui suivent.
Avec le code "\e[0;34m" la suite du texte sera en couleur. Il suffit de remplacer "0;34" par le code couleur voulu. Pour définir la fin de la mise en couleur : "\e[0m". Si vous ne mettez pas de fin, toute la suite sera en couleur (même les résultats des commandes).
Codes couleurs :
- Noir 0;30
- Gris foncé 1;30
- Bleu 0;34
- Bleu clair 1;34
- Vert 0;32
- Vert clair 1;32
- Cyan 0;36
- Cyan clair 1;36
- Rouge 0;31
- Rouge clair 1;31
- Violet 0;35
- Violet clair 1;35
- Brun 0;33
- Jaune 1;33
- Gris clair 0;37
- Blanc 1;37
En fait, le premier nombre correspond au type de la couleur : 0 foncé, 1 clair, 4 souligné, 7 fond, 9 barré.
Et des exemples d'invite :
export PS1="\u@\h \A> "
xenom@hostname 14:13>
Nom_d'utilisateur@Nom_de_la_machine heure>
export PS1='\e[0;31m\u@\h \e[0;35m\w > \e[1;34m'
xenom@hostname /home >
Affichera le nom d'utilisateur et le nom de machine en rouge, le dossier courant en violet et le reste de la commande en bleu.
export PS1='\u@\h [`ps ax | wc -l`(\j)] \$ '
xenom@myhost [109(0)] $
Nom_d'utilisateur@Nom_de_la_machine [Commande_pour_compter_le_nombre_de_processus (tâches_en_arrière_plan)] $
Pour sauvegarder l'invite :
Pour modifier l'invite, il suffit de rentrer dans le terminal :
export PS1="Ce_que_vous_voulez_comme_invite"
Mais dans ce cas, l'invite ne sera modifiée que pour le terminal courant.
Pour le sauvegarder de façon définitive, il suffit de rajouter :
PS1="Ce_que_vous_voulez_comme_invite"
dans le fichier ~/.bashrc.
Autres astuces :
D'autres articles sur génération-linux ont déjà parlé de personnalisation du terminal, je vous invite à les lire (ou relire ;) ) :
$PATH, qu'est-ce que c'est, comment changer les dossiers par défaut ?
Une astuce tres pratique pour le terminal : ajouter un alias
Marre de votre terminal terne et sans vie?
Je vous conseille aussi la lecture de Bash, le livre de recettes par Carl Albing, JP Vossen & Cameron Newham, édition O'Reilly qui m'a aidé pour cet article et beaucoup d'autres choses.
Commentaires
On voit qu'il y en as qui sont en week end...
Juste un truc... Il ne faut pas mettre "export" avant PS1="truc" dans ~./bashrc
;)
une autre petite astuce : le promp-o-matic qui permet de générer son prompt :D : http://www.gilesorr.com/bashprompt/...
Un autre petit truc :P mon bashrc style zsh :P
créer un fichier setPrompt.sh mettez cela dedans
#!/bin/bash
function setPrompt()
{
ROUGE="[\e[31;1m]"
VERT="[\e[32;1m]"
JAUNE="[\e[33;1m]"
BLEU="[\e[34;1m]"
ROSE="[\e[35;1m]"
CYAN="[\e[36;1m]"
BLANC="[\e[37;1m]"
RESET="[\e[0m]"
newPWD=$(sed "s=$HOME=~=" <<< "${PWD}")
DATE=$(date +" %d/%m/%Y")
TIME=$(date +%H:%M)
#UPTIME=$(uptime|cut -f1 -d","|grep -io "[0-9:]*[ a-z]*$")
UPTIME1=$(uptime|sed 's/.*up *\([0-9: ]*\(min\|day\)*\(,[0-9: ]*\)\{0,1\}\),[0-9 ]*user.*/\1/')
LIGNE="┌─→(${USER}@${HOSTNAME}${DATE})(${newPWD})"
MAX_COLUMNS=$((COLUMNS-1))
FILL=""
while [ ${#LIGNE} -lt ${MAX_COLUMNS} ];
do
FILL="-${FILL}"
LIGNE="${LIGNE} "
done
LIGNE1="${JAUNE}┌─→(${RESET}${VERT}${USER}${RESET}${JAUNE}@${RESET}${VERT}${HOSTNAME}${RESET}${VERT}${DATE}${RESET}${JAUNE})${FILL}(${RESET}${CYAN}${newPWD}${RESET}${JAUNE})"
LIGNE3_FIN="(${UPTIME1})"
LIGNE3_DEBUT="└─→(${TIME})─>"
FILL=""
while [ ${#LIGNE3_FIN} -lt ${MAX_COLUMNS} ];
do
LIGNE3_FIN=" ${LIGNE3_FIN}"
FILL=" ${FILL}"
done
LIGNE3_FIN="${FILL}${JAUNE}(${RESET}${CYAN}${UPTIME1}${RESET}${JAUNE})${RESET}${BLANC}"
PS1="${LIGNE1}\n@\n${LIGNE3_FIN}\r[\033[1;32m]${LIGNE3_DEBUT}"
}
dans votre ~/.bashrc
. ~/script/setPrompt.sh
PROMPT_COMMAND=setPrompt
@ Ricard : effectivement, j'avais oublié de l'enlever. Merci, c'est corrigé!
@n3o : Wahou! Y'a pas mal de trucs interessant dans ton script! Ca fait un joli complement.
Pas de soucis !!!!! juste un petit bug lorsque le uptime n'est plus en chiffre est qu'il passe en 1 days , 2 days etc ... je cherche une solution :P
le PS2 est trés utile aussi :P le mien
# couleurs
C_RED="[\e[1;31m]"
C_DEF="[\033[0m]"
PS2="${C_RED}>${C_DEF} "
export PS1="\u@\h \A> "
xenom@hostname 14:13>
c'est dangeureux ça...
Exemple :
xenom@hostname 14:13> toto.sh
on copie colle à la souris... mal, avec le >
et pouf, toto.sh est vide.
détail, mais j'en connais qui se sont fait avoir.
Au risque d'être HS, installer le paquet fortune en langage fr et le rajouter dans le ~/.bashrc, ça le fait ! ;)
pour mon erreur plus haut faut modifier la variable UPTIME1 comme suit
UPTIME1=$(uptime | sed 's/.*up *\([0-9: ]*\(min\|day\)*\([s]\{0,1\},[0-9: ]*\)\{0,1\}\),[0-9 ]*user.*/\1/')
ou sinon, installer ces paquets : lynx cowsay
et ajouter cette ligne dans ~/.bashrc :
lynx --dump --display_charset=utf8 http://www.bashfr.org/?sort=random2 | awk '$1~"#" && $0!~"RSS" { getline; while ($1!~"#") { print $0; getline;}; exit}' | cowthink -W 100 -f $(/bin/ls /usr/share/cowsay/cows -1 | head -n $(expr $$$(date +%s) % $(ls /usr/share/cowsay/cows | wc -w) + 1)| tail -n 1)
J'utilise depuis quelques temps un prompt sur plusieurs lignes.
Au premier abord cela peut sembler bizarre mais au final c'est assez pratique car cela permet d'afficher beaucoups d'informations ou un nom de repertoire tres long sans que cela ne gene la saisie des commandes.
Par example:
export PS1='\n\e[0;31m\u@\h \e[0;35m[\w]\e[1;32m\n$ \e[0m'
je deteste la pensee unique moi
Comment fait on pour que le fond du terminal soit noir au lieu de blanc?
@MFreeze : Cela depend de ton terminal. Pour gnome-terminal c'est dans les préférences, pour urxvt c'est dans le fichier Xdefaults,....
Et comment on fait pour modifier le fichier bash.bashrc ?
gedit refuse de le modifier et en l'ouvrant avec notepad je peux le modifier mais pas enregistrer les modifs... (je suis sous Ubuntu 10.04)
Merci d'avance
Essaye de modifier uniquement le fichier .bashrc de ton répertoire personnel si tu n'a pas les droits root.
Le fichier bash.bashrc n'est modifiable que par l'utilisateur root.
Pour éviter les problemes de retour à la ligne voire de contenu d'historique des commandes, il est préférable d'inclure la spécification des couleurs entre '\[' et '\]', par exemple : '\[\e[1;32m\]' au lieu de '\e[1;32m' .
Ok tout ca c'est joli mais dans quel fichier fait-on toutes ces modif ?
(question de con)
=)