Prompt String
Niveau :
Résumé : export PS1="> "
Désolé de ne pas écrire plus souvent. Et ca risque de durer encore un peu puisque je pars en vacances ...
PS veut dire prompt string. Les 4 prompt string de bash sont les chaines de caractères affichées par le shell en différentes situations. Nous allons nous intéresser à PS1 mais sachez que la suite vaut pour toutes les autres.
Exemples
Je vais faire simple : des exemples de chaînes ainsi que la capture d'écran associée, il ne vous reste plus qu'a choisir et à copier/coller dans votre .bashrc
Toutes les captures ont été faites avec les settings suivants :
- user : peck
- hostname : mamachine.linux-attitude.fr
Exemples unilignes
PS1 | Fond noir / Fond Blanc |
---|---|
"[ ] [e[01;32m]u[e[01;33m]@h[e[00m]:[e[01;34m]w[e[00m]$ " |
|
"[ 33[01;32m]u@h [ 33[01;34m]W $ [ 33[00m]" |
|
"[ 33[0;34m][[ 33[0;31m]$(date +%H%M)[ 33[0;34m]][ 33[0;34m][[ 33[1;31m]u@h:w[ 33[0;34m]][ 33[1;37m]$[ 33[0m] " |
|
|
Exemples multilignes
PS1 | Fond noir / Fond Blanc |
---|---|
"[e]0;u@h wa][e[1;31m]u[e[1;34m]@[e[0;32m]h [e[0;33m]w [e[0;31m]$(uptime|sed -e 's/.*: ([^,]*), ([^,]*), ([^,]*).*/1 2 3/') [e[0;34m]D{%Y-%m-%d %H:%M:%S} [e[0m] $ " |
|
|
Exemples monochromes
PS1 | Fond noir / Fond Blanc |
---|---|
"[ ][u@h:w]$ " |
|
"u@h w> " |
|
"!|h|$(uname -r)|$?> " |
|
"[e[1;34m]u@h w>[e[0m] " |
|
"[e]2;u@H wae[32;1m]>[e[0m] " |
(Ici tout est dans le titre) |
Faites votre choix
Cookbook
Si les exemples ne vous conviennent pas, voici un ensemble de recettes pour créer un prompt qui vous ressemble :
- load average : "$(cut -d ' ' -f 1-3 /proc/loadavg)"
- uptime : "$(uptime | cut -d, -f1 | sed -e 's/.*up//')"
- un prompt qu'on peut copier/coller sans provoquer d'erreurs : ": <texte> ;"
- user@host:/répertoire : "u@h:w"
- date et heure : "[d ]"
- un bip à chaque ligne : "[a]"
- changer la couleur du texte (code couleur voir ci dessous) : "[e[<code_couleur>m]"
- revenir à la couleur originale du shell (en fin de ligne) : "[e[0m]"
- code de retour de la dernière commande : "-> $?"
- nombre de jobs mis en background par le shell : "[j]"
- nombre de jobs en pause : "$(jobs | wc -l | awk '{print $1}')"
- nombre de processus en cours d'exécution : "$(ps ax | wc -l | tr -d ' ')"
- afficher le tty en cours : "$(temp=$(tty) ; echo ${temp:5})"
- chemin limité à 20 caractères : "$(a='w';b=${a: -20};b=${b:+..$b};echo ${b:-$a})"
- changer le texte de titre du terminal (xterm, konsole ...) : "[e]0;<Texte>a]"
- afficher l'état de la gestion de version en cours (voir ci dessous) : "$(__vcs_dir)"
- afficher la sortie d'une commande : "$(<commande>)"
Codes couleur ANSI
Il est possible d'indiquer plusieurs codes simultanément en les séparant par un ';'.
From wikipedia :
Code | Effect | Note |
---|---|---|
0 | Reset / Normal | all attributes off |
1 | Intensity: Bold | |
2 | Intensity: Faint | not widely supported |
3 | Italic: on | not widely supported. Sometimes treated as inverse. |
4 | Underline: Single | |
5 | Blink: Slow | less than 150 per minute |
6 | Blink: Rapid | MS-DOS ANSI.SYS; 150 per minute or more |
7 | Image: Negative | inverse or reverse; swap foreground and background |
8 | Conceal | not widely supported |
21 | Underline: Double | not widely supported |
22 | Intensity: Normal | not bold and not faint |
24 | Underline: None | |
25 | Blink: off | |
27 | Image: Positive | |
28 | Reveal | conceal off |
30–39 | Set foreground color, normal intensity | 3x, where x is from the color table below |
40–49 | Set background color, normal intensity | 4x, where x is from the color table below |
90–99 | Set foreground color, high intensity | aixterm |
100–109 | set background color, high intensity | aixterm |
Intensité | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
---|---|---|---|---|---|---|---|---|---|
Normal | Black | Red | Green | Yellow[5] | Blue | Magenta | Cyan | White | reset |
Brillant | Black | Red | Green | Yellow | Blue | Magenta | Cyan | White |
Gestion de version
Pour que la méthode de gestion de version fonctionne, il faut ajouter le code suivant dans son .bashrc :
alias svnwdiff="svn diff --diff-cmd /home/spaillar/vimdiff-wrapper.sh" function cvswdiff { vimdiff $1 <(cvs co -p $2 $(cat $(dirname $1)/CVS/Repository)/$(basename $1)) ;} function vlog { # cvs cvs_log() { [ -d "CVS" ] || return 1 cvs log "$@" | vim - } # subversion svn_log() { [ -d ".svn" ] || return 1 svn log -v "$@" | vim - } # git git_log() { base_dir=$(git rev-parse --show-cdup 2>/dev/null) || return 1 git log --name-status "$@" | vim - } git_log "$@" || svn_log "$@" || cvs_log "$@" } function vwdiff { vim -c ":VCSVimDiff" $1 } function vpull { # cvs cvs_pull() { [ -d "CVS" ] || return 1 cvs -q up -d } # subversion svn_pull() { [ -d ".svn" ] || return 1 svn up } # git git_pull() { base_dir=$(git rev-parse --show-cdup 2>/dev/null) || return 1 git pull } git_pull "$@" || svn_pull "$@" || cvs_pull "$@" } _bold=$(tput bold) _normal=$(tput sgr0) _yellow=$(tput setaf 3) _green=$(tput setaf 2) __vcs_dir() { local vcs base_dir sub_dir ref sub_dir() { local sub_dir sub_dir=$(readlink -f "${PWD}") sub_dir=${sub_dir#$1} echo ${sub_dir#/} } # git git_dir() { base_dir=$(git rev-parse --show-cdup 2>/dev/null) || return 1 if [ -n "$base_dir" ]; then base_dir=`cd $base_dir; pwd` else base_dir=$PWD fi sub_dir=$(git rev-parse --show-prefix) sub_dir="/${sub_dir%/}" ref=$(git symbolic-ref -q HEAD || git name-rev --name-only HEAD 2>/dev/null) ref=${ref#refs/heads/} vcs="git" alias pull="git pull" alias commit="git commit" alias push="git push" # alias revert="svn revert" } # subversion svn_dir() { [ -d ".svn" ] || return 1 base_dir="." while [ -d "$base_dir/../.svn" ]; do base_dir="$base_dir/.."; done base_dir=`cd $base_dir; pwd` sub_dir="/$(sub_dir "${base_dir}")" ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }') vcs="svn" alias pull="svn up" alias commit="svn commit" alias push="svn ci" alias revert="svn revert" } # mercurial hg_dir() { base_dir="." while [ ! -d "$base_dir/.hg" ]; do base_dir="$base_dir/.."; [ $(readlink -f "${base_dir}") = "/" ] && return 1; done base_dir=$(readlink -f "$base_dir") sub_dir="/$(sub_dir "${base_dir}")" ref=$(< "${base_dir}/.hg/branch") hgqtop=$(hg qtop) if [[ $hgqtop == 'No patches applied' ]]; then extra=""; else extra=" >> $hgqtop" fi vcs="hg" } # cvs cvs_dir() { [ -d "CVS" ] || return 1 base_dir="." while [ -d "$base_dir/../CVS" ]; do base_dir="$base_dir/.."; done base_dir=`cd $base_dir; pwd` sub_dir="/$(sub_dir "${base_dir}")" vcs="cvs" alias pull="cvs -q up -d" alias commit="cvs commit" alias push="cvs ci" alias revert="cvs revert" } # hg_dir || git_dir || svn_dir || cvs_dir || base_dir="$PWD" git_dir || svn_dir || cvs_dir || base_dir="$PWD" echo "$green$bold${vcs:+($vcs)}$yellow$bold${vcs:+[$ref]}$normal${base_dir/$HOME/~}$yellow$bold${vcs:+$bold${sub_dir}$normal$extra}" } PS1='${debian_chroot:+($debian_chroot)}u@h:$(__vcs_dir)$normal$ '
Et vous quel prompt utilisez vous ?
Tags:Commande, planet-libre