Page suivantePage pr�c�denteTable des mati�res

4. Exemples pour quelques shells

Nous donnons ci-dessous des exemples pour les shells les plus courants. Nous commen�ons avec zsh car il offre des possibilit�s qui facilitent grandement notre t�che. Nous progresserons ensuite vers des exemples de plus en plus difficiles.

Dans tous les exemples ci-dessous, on teste la variable d'environnement TERM pour �tre certain de n'appliquer ces s�quences que si l'on est dans un xterm (ou d�riv�). Le test est fait sur TERM=xterm*, de mani�re � inclure au passage les variantes telles que TERM=xterm-color (d�fini par rxvt).

Encore une remarque au sujet des d�riv�s du C shell tels que tcsh et csh. Dans ces shells, les variables non-d�finies causent des erreurs fatales. Il est d�s lors n�cessaire avant de tester la valeur de la variable $TERM, de tester si elle existe pour ne pas interrompre un shell non-interactif. Pour y parvenir, il faut inclure les exemples ci-dessous dans quelque chose du genre :

 if ($?TERM) then
 ...
 endif
(� notre avis, il s'agit d'une raison parmi beaucoup d'autres de ne pas utiliser les C shells. Voir Csh Programming Considered Harmful pour une discussion utile).

Pour utiliser les exemples suivants, placez-les dans le fichier d'initialisation du shell apropri�, c'est-�-dire un fichier lu lors du lancement d'un shell interactif. Le plus souvent il s'agit de .shellrc (ex : .zshrc, .tcshrc, etc.)

4.1 zsh

On utilise quelques fonctions et codes offerts par zsh :

precmd ()   fonction ex�cut�e juste avant chaque invite
chpwd ()    fonction ex�cut�e lors de chaque changement de r�pertoire
\e          code du caract�re escape (ESC)
\a          code du caract�re bip (BEL)
%n          code remplac� par $USERNAME
%m          code remplac� par le hostname jusqu'au premier '.'
%~          code remplac� par le r�pertoire, avec '~' � la place de $HOME
De nombreux autres codes sont disponibles, voir 'man zshmisc'.

Ainsi, le code suivant, mis dans ~/.zshrc, affiche "nom@serveur:r�pertoire" dans le titre de la fen�tre (et de l'ic�ne).

case $TERM in
 xterm*)
 precmd () {print -Pn "\e]0;%n@%m: %~\a"}
 ;;
esac
On arrive au m�me r�sultat en utilisant chpwd() au lieu de precmd(). La commande interne print fonctionne comme echo, mais donne acc�s aux s�quences %.

4.2 tcsh

tcsh offre des possibilit�s similaires � celles de zsh :

precmd ()   fonction ex�cut�e juste avant chaque invite
chpwd ()    fonction ex�cut�e lors de chaque changement de r�pertoire
%n          code remplac� par $USERNAME
%m          code remplac� par le hostname jusqu'au premier '.'
%~          code remplac� par le r�pertoire, avec '~' � la place de $HOME

Malheureusement, il n'y a pas d'�quivalent � la fonction print de zsh qui permette d'utiliser les codes de l'invite dans la cha�ne du titre ; le mieux que l'on puisse faire est d'utiliser les variables du shell (dans ~/.tcshrc) :

switch ($TERM)
 case "xterm*":
 alias precmd 'echo -n "\033]0;${HOST}:$cwd\007"'
 breaksw
endsw
mais on obtient alors le chemin complet du r�pertoire, sans '~'. Par contre, on peut mettre la cha�ne dans l'invite :
switch ($TERM)
 case "xterm*":
 set prompt="%{\033]0;%n@%m:%~\007%}tcsh%# "
 breaksw
 default:
 set prompt="tcsh%# "
 breaksw
endsw
ce qui donne "tcsh% " comme invite, et "nom@serveur: r�pertoire" dans le titre (et l'ic�ne) de xterm. Les "%{...%}" doivent �tre plac�s autour des s�quences d'�chappement (et ne peuvent pas �tre le dernier �l�ment de l'invite, 'man tcsh' donne plus de d�tails).

4.3 bash

bash offre la variable PROMPT_COMMAND qui contient une commande � ex�cuter avant d'afficher l'invite. Ce code (ins�r� dans ~/.bashrc) affiche nom@serveur: r�pertoire dans le titre de la fen�tre (et de l'ic�ne).

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
o� \033 est le caract�re ESC et \007BEL.

Il convient de noter que les guillemets jouent un r�le important : les variables entre "..." sont �valu�es, alors que celles entre "..." ne le sont pas. Ainsi, PROMPT_COMMAND re�oit bien le nom des variables, ces derni�res �tant �valu�es lorsque PROMPT_COMMAND est invoqu�e.

Cependant, $PWD donne le r�pertoire complet. Si l'on veut utiliser le raccourci ~, il faut placer toute la s�quence d'�chappement dans l'invite pour avoir acc�s aux codes suivants :

\u          est remplac� par $USERNAME
\h          est remplac� par le hostname jusqu'au premier '.'
\w          est remplac� par le repertoire, avec '~' � la place de $HOME
\[...\]     signale une suite de caract�re non-imprimables

Ainsi le code suivant produit l'invite bash$ , et place nom@serveur: r�pertoire dans le titre (et l'ic�ne) de xterm.

case $TERM in
 xterm*)
 PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
 ;;
 *)
 PS1="bash\$ "
 ;;
esac
L'utilisation de \[...\] signale � bash la pr�sence de caract�res non-imprimables, information dont il a besoin lorsqu'il calcule la longueur de l'invite. Sans cette pr�caution, les commandes d'�dition de ligne ne savent plus tr�s bien o� placer le curseur.

4.4 ksh

ksh n'offre pas grand chose en terme de fonctions et codes, il faut donc mettre notre cha�ne dans l'invite pour qu'elle soit mise � jour dynamiquement. L'exemple suivant produit l'invite ksh$ , et place nom@serveur: r�pertoire dans le titre (et l'ic�ne) de xterm.

case $TERM in
 xterm*)
 HOST=`hostname`
 PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
 ;;
 *)
 PS1='ksh$ '
 ;;
esac
Cependant, $PWD donne le r�pertoire complet. On peut �ter le pr�fixe $HOME/ en utilisant la construction ${...##...}. De m�me, on peut tronquer le nom du serveur � l'aide de ${...%%...}.
HOST=`hostname`
HOST=${HOST%%.*}
PS1='^[]0;${USER}@${HOST}: ${PWD##${HOME}/}^Gksh$ '
Les caract�res ^[ et ^G d�signent ESC et BEL (ils peuvent �tre saisis dans emacs � l'aide de C-q ESC et C-q C-g).

4.5 csh

C'est assez difficile � r�aliser avec csh. On finit par mettre ce qui suit dans le ~/.cshrc :

switch ($TERM)
 case "xterm*":
 set host=`hostname`
 alias cd 'cd \!*; echo -n "^[]0;${user}@${host}: ${cwd}^Gcsh% "'
 breaksw
 default:
 set prompt='csh% '
 breaksw
endsw
Il a fallu faire un alias de la commande cd pour mettre � jour l'invite. Les caract�res ^[ et ^G d�signent ESC et BEL (ils peuvent �tre saisis dans emacs � l'aide de C-q ESC et C-q C-g).

Notes : sur certains syst�mes hostname -s peut �tre utilis� pour obtenir le nom de la machine au lieu du nom qualifi�. Les utilisateurs ayant des liens symboliques sur des r�pertoires trouveront `pwd` plus pr�cis que $cwd.


Page suivantePage pr�c�denteTable des mati�res

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:21