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
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.
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/*\//}#'.
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.
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/'
}
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.
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
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.
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)'