Question Afficher uniquement le nom du répertoire en cours (pas le chemin d'accès complet) à l'invite de bash


La manière dont mon invite bash est actuellement configurée affiche le chemin d'accès complet au répertoire en cours. C'est ennuyant quand je suis au fond d'une arborescence de répertoires, car l'invite devient si longue que chaque commande passe à la ligne suivante. Comment puis-je lui faire montrer 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

65
2017-10-25 21:38


origine




Réponses:


Changer la \w (minuscule) à \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 ------------------------------------------------+    

Regardez le Bash Prompt HOWTO pour beaucoup 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$

le PROMPT_COMMAND variable, si elle est définie, est une commande qui est exécutée avant d’afficher l’invite spécifiée dans PS1. Dans ton cas, PROMPT_COMMAND court un echo déclaration avec certains Séquences d'échappement ANSI cette manipuler la barre de titre d'un Xterm.

Si vous soupçonnez votre PROMPT_COMMAND est en train de remplacer votre PS1 invite, vous pouvez unset et tester les choses:

$ unset PROMPT_COMMAND

Enfin, assurez-vous de changer la PS1 définition 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.


84
2017-10-25 21:54



Hm ... J'ai peur que ce soit déjà \ w, mais ça semble être comme ça case déclaration le remplace quand je suis sur un xterm, et le problème semble être avec le PWD dans le PROMPT_COMMAND ligne. Savez-vous ce que je devrais y mettre? - hsribei
\w (minuscule) le met à plein chemin, \W (majuscule) coupe au dernier bit. PROMPT_COMMAND définit le titre de la fenêtre dans un xterm. vérifiez votre variable TERM; si ce n'est pas début avec "xterm" ou "rxvt", PROMPT_COMMAND n'est même pas exécuté. - quack quixote
Oh oui, bah. Désolé, j'ai mélangé les majuscules et les minuscules. Ça a marché. Merci! :) - hsribei
Très bonne réponse. Assurez-vous de redémarrer pour que cela prenne effet. Merci! - Combine


La commande simple de remplacement de bash est

${VAR/pattern_to_find/pattern_to_replace}

Pour afficher le dernier répertoire que vous pouvez faire ${PWD/*\//}, c.-à-d. trouver quelque chose avant et y compris le dernier '/'et remplacez-le par rien.

Sur ma machine Ubuntu, j'utilise:

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

10
2018-06-06 22:11



Seulement six ans de retard! - Burgi
J'aime mieux cette réponse que celle acceptée car elle est générique pour toute situation au lieu de la logique d'analyse spéciale de $ PS1. Moins d'outils plus puissants sont plus faciles à mémoriser et à composer. :) - David Ellis


Ma solution consiste à afficher les trois premiers et deux premiers répertoires lorsqu'il y a plus de cinq 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 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 actuelle de git, je la garde dans mes dotfiles, c'est:

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

2
2018-05-15 12:42





Ma solution est légèrement différente en ce qui concerne la manière de l'exporter, alors j'ai pensé que je la partagerais ici:

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

\ u: Affiche le nom d'utilisateur actuel.

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

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

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


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

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

source encore une fois, et maintenant vous pouvez simplement taper PS5 commuter.


2
2017-08-18 21:13



Cela ressemble à un frankenalias. Pourquoi ne pas simplement utiliser un alias ou une fonction? - muru
@muru Merci, c'est beaucoup mieux, réponse mise à jour. - 1010101


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

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

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

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

0
2018-05-26 14:17





Afficher uniquement le nom du répertoire en cours (pas le chemin d'accès complet) à l'invite de bash

La plupart des autres solutions ne fonctionnaient pas pour moi sur tous mes systèmes d'exploitation partageant mes fichiers de points: AIX, Windoze et Linux. Les ports bash étaient d'anciennes versions qui ne prenaient pas en charge certaines constructions et je ne voulais pas lancer un autre processus (c'est-à-dire sed, awk, etc.) qui est sensiblement chère 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 qu'il crache:

/
/usr
/usr/foo
foo/bin

Notez l'absence d'une barre oblique dans la dernière ligne, ce qui me plait. En outre, vous pouvez recracher les 3 derniers répertoires en changeant l'argument en DIR_LAST.

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


0
2018-02-12 22:32