Prompt String

Niveau : Star Star Star Empty Empty
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

PS1Fond noir / Fond Blanc
"[ ] [e[01;32m]u[e[01;33m]@h[e[00m]:[e[01;34m]w[e[00m]$ " black
white
"[33[01;32m]u@h [33[01;34m]W $ [33[00m]" black
white
"[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] " black
white
 
 

Exemples multilignes

PS1Fond 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] $ " black
white
 
 

Exemples monochromes

PS1Fond noir / Fond Blanc
"[ ][u@h:w]$ " black
white
"u@h w> " black
white
"!|h|$(uname -r)|$?> " black
white
"[e[1;34m]u@h w>[e[0m] " black
white
"[e]2;u@H wae[32;1m]>[e[0m] " black
white
(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 couleur
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
Table des couleurs
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:,
Vus : 515
Publié par Peck : 100