Les fonctionnalités de contrôle rapide de Bash sont plutôt statiques. Si vous voulez plus de contrôle, vous pouvez inclure des variables dans votre invite; assurez-vous que vous n'avez pas désactivé l' promptvars
option .
PS1='${PWD#"${PWD%/*/*}/"} \$ '
Notez les guillemets simples: les extensions de variable doivent se produire au moment où l'invite est affichée, pas au moment où la PS1
variable est définie.
Si vous voulez plus de contrôle sur ce qui est affiché, vous pouvez utiliser des substitutions de commande. Par exemple, l'extrait ci-dessus perd l' ~
abréviation du répertoire personnel.
PS1='$(case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac; printf %s "$HPWD") \$ '
Ce code est plutôt lourd, donc au lieu de le coller dans la PS1
variable, vous pouvez utiliser la PROMPT_COMMAND
variable pour exécuter le code à définir HPWD
, puis l'utiliser dans votre invite.
PROMPT_COMMAND='case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac'
PS1='$HPWD \$'
Étant donné que l'invite raccourcie n'a été modifiée que lors d'un changement de répertoire, vous n'avez pas besoin de le recalculer chaque fois qu'une invite s'affiche. Bash ne fournit pas de hook qui s'exécute sur un changement de répertoire en cours, mais vous pouvez le simuler en remplaçant cd
et ses cousins.
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac
}
PS1='$HPWD \$'
Notez que vous n'avez pas besoin d'exporter et que vous ne devez pas l'exporter PS1
, car il s'agit d'un paramètre shell, et non d'une variable d'environnement. Un PS1
réglage bash ne serait pas compris par les autres obus.
PS Si vous voulez une belle expérience de shell interactif, passez à zsh , où tous ces éléments ( %
extensions rapides englobant largement les tcsh chpwd
, etc.) sont des fonctionnalités natives.
PS1='%2~ %# '
PS1='\w \$'; PROMPT_DIRTRIM=2
devrait vous donner l'équivalent bash, mais cela ne fonctionne pas correctement sur mon système.