119 votes

Afficher seulement le nom du répertoire courant (pas le chemin complet) à l'invite de bash

La façon dont mon invite bash est actuellement configurée, elle affiche le chemin complet du répertoire actuel. C'est ennuyeux quand je suis profondément dans une arborescence de répertoires, car l'invite devient si longue que chaque commande se prolonge sur la ligne suivante. Comment faire pour qu'il n'affiche que la dernière partie du chemin ?

C'est ce que j'ai dans mon .bashrc :

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
    ;;
*)
    ;;
esac

157voto

user12786 Points 454

Changez le \w (minuscules) à \W (en majuscules) :

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
                                                                                       ^^
           this one waaaaaay over here ------------------------------------------------+    

Jetez un coup d'œil à la Guide pratique de l'invite Bash pour de nombreux détails amusants, par exemple :

user@host:/usr/local/bin$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ 

user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '

user@host:bin$

El PROMPT_COMMAND est une commande qui est exécutée avant l'affichage de l'invite spécifiée dans la variable PS1 . Dans votre cas, PROMPT_COMMAND exécute un echo avec certains Séquences d'échappement ANSI que manipuler la barre de titre d'un Xterm .

Si vous pensez que votre PROMPT_COMMAND remplace votre PS1 vous pouvez unset et de tester les choses :

$ unset PROMPT_COMMAND

Enfin, assurez-vous que vous modifiez l'adresse de l'utilisateur. PS1 définition qui est réellement utilisée. Les emplacements courants sont /etc/bash.bashrc , /etc/profile , ~/.bashrc , ~/.bash_profile , ~/.profile . Les fichiers système sont généralement (mais pas toujours) exécutés avant les fichiers utilisateur.

28voto

stopBugs Points 381

La commande bash simple de remplacement est

${VAR/pattern_to_find/pattern_to_replace}

Pour afficher le dernier répertoire, vous pouvez simplement faire ${PWD/*\//} c'est-à-dire trouver tout ce qui se trouve avant et y compris le dernier / et le remplacer par rien.

Sur ma machine ubuntu, j'utilise :

export PS1='$(whoami):${PWD/*\//}#'.

8voto

Michael Durrant Points 1148

Ma solution consiste à afficher les trois premiers et les deux derniers répertoires lorsqu'il y en a plus de 5.

Mon message (qui contient également d'autres informations) ressemble donc à ceci :

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote

alors que mon pwd est en fait

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote

Mon invite PS1 est configurée comme suit :

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

git_branch est une fonction qui montre la branche git actuelle, je la garde dans mes dotfiles, elle est :

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }

4voto

U-ways Points 181

La solution que j'ai trouvée est légèrement différente en ce qui concerne la façon dont je l'exporte. J'ai donc pensé que je devais la partager ici :

Créez une autre variable de chaîne d'invite ; PS5 et exportez la chaîne suivante dans votre fichier .profile / .bash_profile fichier :

\u : Afficher le nom d'utilisateur actuel .

\W : Imprimer la base du répertoire de travail actuel.

# Display username and current directory only.
export PS5='export PS1="\u:\W$";';

Maintenant, chaque fois que vous avez besoin d'utiliser le raccourci PS, il suffit d'exécuter : eval $PS5


Ou mieux encore, créer un alias dans votre .bash_aliases fichier : (merci à @muru )

alias PS5='export PS1="\u:\W$";';

source à nouveau, et maintenant vous pouvez juste taper PS5 pour changer.

1voto

Dani Mach Points 111

Je crois que cette option est beaucoup plus facile, en faisant simplement :

echo $PWD | rev | cut -d '/' -f 1 | rev

Attribuez donc cette variable à la variable PS1 dans votre fichier .bashrc :

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X