GNU/Linux >> Tutoriels Linux >  >> Linux

Comment produire une invite Ps1 dans Bash ou Ksh93 similaire à Tcsh ?

Dans tcsh, j'ai la valeur par défaut :

prompt  [%m:%c3] %n%# 

qui donne des invites comme :

[woehler:hacking/c/hello] ajcarr% 

et

[woehler:~] ajcarr% 

En d'autres termes, le répertoire actuel et jusqu'aux deux suivants au-dessus dans le chemin.

Dans ksh93 ou bash, la substitution de $HOME par ~ est facile, tout comme l'extraction du nom du répertoire actuel uniquement, mais je n'ai pas encore trouvé de moyen de répliquer le %c3 comportement de tcsh. Actuellement dans ksh93 j'ai :

[[email protected]] hello $ 

et

[[email protected]] ~ $ 

Quelqu'un a-t-il des suggestions sur la façon de procéder ?

Réponse acceptée :

En ksh93 :

PS1='${PWD#${PWD%?/*/*/*}?/} $ '
share/doc/libnl-3-dev $ _

PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[host:share/doc/libnl-3-dev] user% _

Si vous voulez qu'il remplace également $HOME avec ~ , il faut quelque chose de plus méchant :

PS1='$(d=${PWD/#$HOME/"~"};printf %s "${d#${d%?/*/*/*}?/}") $ '
~/w/maemo $ cd sb2-pathmaps
w/maemo/sb2-pathmaps $ _

PS1='$(d=${PWD/#$HOME/"~"};printf %s "[${HOSTNAME%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
[host:w/maemo/sb2-pathmaps] user% _

Tout cela devrait également fonctionner dans bash , bien que bash a ses propres échappements d'invite (par exemple, h pour ${HOSTNAME%%.*} ) et mécanisme de raccourcissement de chemin (avec PROMPT_DIRTRIM ).

De plus, la variante la plus méchante sera vraiment méchante, car bash , contrairement à ksh93 , va fork() un processus séparé pour chaque $(...; printf ...) substitution de commande, même si elle ne contient que des commandes intégrées. Cela vaut également pour pdksh shells dérivés, comme mksh .

zsh a des échappements d'invite assez similaires mais pas identiques à tcsh :

zsh$ PS1='[%m:%3c] %n%# '
[host:share/doc/libnl-3-dev] user% _

Remarque :

Le $HOSTNAME la variable n'est pas définie par défaut dans ksh93; à la place, vous pouvez utiliser le uname builtin (après l'avoir activé avec PATH=/opt/ast/bin:$PATH; le /opt/ast/bin le chemin n'a pas besoin d'exister):

PS1='$(d=${PWD/#$HOME/"~"};h=$(uname -n); printf %s "[${h%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '

Contrairement au h échapper en bash ou %m échapper en zsh ou tcsh cela va suivre les changements de nom d'hôte.


Linux
  1. Comment utiliser les commandes d'historique de Bash

  2. Comment écrire une boucle dans Bash

  3. Comment personnaliser les couleurs et le contenu de Bash dans l'invite du terminal Linux

  4. Comment déboguer un script bash ?

  5. Comment détecter Bash>=4.0 ?

Comment commenter dans Bash

Comment personnaliser l'invite Bash sous Linux

Comment créer des alias Bash

Comment personnaliser l'invite du terminal Bash sur Debian 10

Comment raccourcir l'invite Bash sous Linux ?

Comment exécuter un script bash