web-dev-qa-db-fra.com

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

La configuration actuelle de mon invite bash indique le chemin d'accès complet au répertoire en cours. Ceci est agaçant lorsque je me trouve au cœur d’une arborescence de répertoires, car l’invite devient si longue que chaque commande est renvoyée à la ligne suivante. Comment puis-je lui faire montrer que la dernière partie du chemin?

Voici 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
68
hsribei

Changez le \w (minuscule) en \W (majuscule):

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 au HOWTO Bash Prompt pour plus de détails amusants. 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$

La variable Prompt_COMMAND, si elle est définie, est une commande à exécuter avant d'afficher l'invite spécifiée dans PS1. Dans votre cas, Prompt_COMMAND exécute une instruction echo avec certaines séquences d'échappement ANSI qui manipulent la barre de titre d'un Xterm .

Si vous pensez que votre Prompt_COMMAND remplace votre invite PS1, vous pouvez unset et tester des éléments:

$ unset Prompt_COMMAND

Enfin, assurez-vous de changer la définition PS1 qui est réellement utilisée. Les emplacements communs 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.

89
quack quixote

La commande de remplacement bash simple 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 précède et y compris le dernier '/' et ne le remplacer par rien.

Sur ma machine Ubuntu, j'utilise:

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

Ma solution à cela est légèrement différente en ce qui concerne la façon de l'exporter. Je pensais donc la partager ici:

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

\u : Affiche le nom d'utilisateur actuel.

\W : Affiche 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 devez utiliser le PS raccourci, exécutez simplement: eval $PS5


Ou encore mieux, créez un alias dans votre fichier .bash_aliases: (grâce à @ muru )

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

source encore, et maintenant vous pouvez simplement taper PS5 pour changer.

4
U-ways

Ma solution consiste à afficher les trois répertoires supérieurs et inférieurs 2 lorsqu'il y a plus de 5 répertoires.

Donc, mon invite (qui a aussi d'autres informations) ressemble à ceci:

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

quand mon pwd est réellement

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

Mon invite PS1 est configuré 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 courante de git, je la garde dans mes fichiers de points, c’est:

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

Afficher uniquement le nom du répertoire actuel (pas le chemin complet) à l'invite bash

La plupart des autres solutions ne fonctionnaient pas pour moi sur tous les systèmes d'exploitation partageant mes fichiers de points: AIX, Windoze et Linux. Les ports bash étaient d'anciennes versions qui ne supportaient pas certaines constructions et je ne voulais pas créer un autre processus (c'est-à-dire sed, awk, etc.), ce qui est sensiblement coûteux sous cygwin.

Ce qui suit est long mais performant:

# takes a number argument of the number of last dirs to show
function DIR_LAST {
    # read -a didn't seem to work under bash 3
    IFS='/' array=($PWD)
    len=${#array[@]}
    start=$((len - $1))
    # leading / if fewer dir args: /usr/flastname not usr/flastname
    if (( $start <= 1 )); then
        start=1
        echo -n /
    fi
    for (( i = $start; $i < $len; i++ )); do
        if (( $i > $start )); then
            echo -n /
        fi
        echo -n ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

Je veux que ça crache:

/
/usr
/usr/foo
foo/bin

Remarquez l'absence de barre oblique dans la dernière ligne, ce qui me plait. En outre, vous pouvez cracher les 3 derniers répertoires en remplaçant le paramètre argument par DIR_LAST.

Aussi, j'ai essayé de faire cela avec une regex et BASH_REMATCH mais bash v3 ne semblait pas aimer les parens et je ne pouvais pas trouver comment leur échapper correctement. Soupir.

1
Gray
root:~/project#  -> root:~/project(dev)# 

ajoutez le code suivant à la fin de votre ~/.bashrc

force_color_Prompt=yes
color_Prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_Prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_Prompt force_color_Prompt
0
Ali Alp

Voici un petit outil génial qui fournit une interface glisser-déposer pour créer votre propre invite bash, que vous pouvez ensuite simplement copier dans votre .bashrc. Utilisez l'élément "Directory (basename)" pour afficher uniquement le nom du dossier en cours, plutôt que le chemin d'accès complet.

0
HoboFlo

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

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

Donc, assignez ceci à la variable PS1 de votre fichier .bashrc:

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