Nur den aktuellen Verzeichnisnamen (nicht den vollständigen Pfad) an der Bash-Eingabeaufforderung anzeigen

71

So wie meine Bash-Eingabeaufforderung derzeit konfiguriert ist, wird der gesamte Pfad zum aktuellen Verzeichnis angezeigt. Das ist ärgerlich, wenn ich tief in einem Verzeichnisbaum bin, da die Eingabeaufforderung so lang wird, dass jeder Befehl in die nächste Zeile umgebrochen wird. Wie kann ich festlegen, dass nur der letzte Teil des Pfades angezeigt wird?

Das habe ich in meinem .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
hsribei
quelle

Antworten:

98

Ändern Sie die \w(Kleinbuchstaben) in \W(Großbuchstaben):

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

Schauen Sie sich das Bash Prompt HOWTO für viele lustige Details an. Beispiel:

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$

Die PROMPT_COMMANDVariable ist, falls festgelegt, ein Befehl, der ausgeführt wird, bevor die in angegebene Eingabeaufforderung angezeigt wird PS1. Führt in Ihrem Fall PROMPT_COMMANDeine echoAnweisung mit bestimmten ANSI-Escape-Sequenzen aus , die die Titelleiste eines Xterm manipulieren .

Wenn Sie vermuten , dass Ihr PROMPT_COMMANDIhr ist zwingende PS1Aufforderung, können Sie unsetes und Test Dinge aus:

$ unset PROMPT_COMMAND

Stellen Sie schließlich sicher, dass Sie die PS1tatsächlich verwendete Definition ändern . Gemeinsame Positionen sind /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile. Die Systemdateien werden im Allgemeinen (aber nicht immer) vor den Benutzerdateien ausgeführt.

Quacksalber
quelle
Hm ... ich fürchte, es ist bereits \ w, aber es scheint, als ob diese caseAussage es außer Kraft setzt, wenn ich auf einem X-Term bin, und das Problem scheint mit dem PWDin der PROMPT_COMMANDZeile zu sein. Weißt du was ich da hinstellen soll?
Hsribei
4
\w(Kleinbuchstaben) setzt es auf vollen Pfad, \W(Großbuchstaben) schneidet auf das letzte Bit. Der PROMPT_COMMAND setzt den Fenstertitel in einem xterm. Überprüfen Sie Ihre TERM-Variable. wenn es nicht beginnen mit „xterm“ oder „rxvt“ dann wird PROMPT_COMMAND nicht einmal laufen zu bekommen.
Quack Quijote
Oh ja, duh. Sorry, ich habe Groß- und Kleinschreibung gemischt. Das hat funktioniert. Vielen Dank! :)
hsribei
Gute Antwort. Stellen Sie sicher, dass Sie neu starten, damit dies wirksam wird. Vielen Dank!
Kombinieren Sie
14

Der einfache Bash-Ersetzungsbefehl lautet

${VAR/pattern_to_find/pattern_to_replace}

Zum Anzeigen des letzten Verzeichnisses können Sie einfach ${PWD/*\//}etwas vorher suchen und das letzte ' /' einfügen und durch nichts ersetzen.

Auf meinem Ubuntu-Rechner verwende ich:

export PS1='$(whoami):${PWD/*\//}#'. 
stopBugs
quelle
1
Diese Antwort gefällt mir besser als die akzeptierte, da sie generisch für jede Situation ist und nicht nur die spezielle Parsing-Logik von $ PS1. Weniger leistungsfähigere Werkzeuge lassen sich leichter merken und komponieren. :)
David Ellis
4

Meine Lösung besteht darin, die oberen drei und unteren 2 Verzeichnisse anzuzeigen, wenn mehr als 5 vorhanden sind

Meine Eingabeaufforderung (die auch andere Informationen enthält) sieht also so aus:

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

wenn mein pwd eigentlich ist

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

Meine PS1-Eingabeaufforderung wird wie folgt eingerichtet:

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 ist eine Funktion, die den aktuellen Git-Zweig anzeigt, ich behalte ihn in meinen Punktedateien, es ist:

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }
Michael Durrant
quelle
Das ist fantastisch! Vielen Dank für diese Antwort.
Carlos F
4

Meine Lösung für dieses Problem unterscheidet sich geringfügig in Bezug darauf, wie ich es exportiere.

Erstellen Sie eine weitere Eingabeaufforderungsvariable. PS5 und exportieren Sie die folgende Zeichenfolge in Ihre .profile/ .bash_profile-Datei:

\ u : Zeigt den aktuellen Benutzernamen an.

\ W : Gibt die Basis des aktuellen Arbeitsverzeichnisses aus.

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

Nun, wann immer Sie die Kurzschrift-PS verwenden müssen, führen Sie einfach Folgendes aus: eval $PS5


Oder noch besser, erstelle einen Alias ​​in deiner .bash_aliasesDatei: (danke an @muru )

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

sourcewieder, und jetzt können Sie einfach tippen PS5, um zu wechseln.

U-Wege
quelle
1
Das sieht aus wie ein Frankenalias. Warum nicht einfach einen Alias ​​oder eine Funktion verwenden?
Muru
1

Nur den aktuellen Verzeichnisnamen (nicht den vollständigen Pfad) an der Bash-Eingabeaufforderung anzeigen

Die meisten anderen Lösungen funktionierten nicht unter allen Betriebssystemen, die meine Punktedateien gemeinsam nutzen: AIX, Windoze und Linux. Die bash - Ports waren alte Versionen , die nicht bestimmte Konstrukte unterstützt haben und ich wollte keinen weiteren Prozess Gabel (dh sed, awkusw.) , die deutlich teurer unter Cygwin ist.

Das Folgende ist lang, aber 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)} "

Ich möchte, dass es ausspuckt:

/
/usr
/usr/foo
foo/bin

Beachten Sie das Fehlen eines führenden Schrägstrichs in der letzten Zeile, so wie es mir gefällt. Sie können auch die letzten 3 Verzeichnisse ausspucken, indem Sie das Argument in ändern DIR_LAST.

Ich habe auch versucht, dies mit einer Regex zu tun, BASH_REMATCHaber Bash V3 schien die Parens nicht zu mögen und ich konnte nicht herausfinden, wie ich ihnen richtig entkommen konnte. Seufzer.

Grau
quelle
0

Ich glaube, diese Option ist viel einfacher, wenn Sie einfach Folgendes tun:

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

Weisen Sie dies der PS1-Variablen in Ihrer .bashrc-Datei zu:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'
Dani Mach
quelle
0
root:~/project#  -> root:~/project(dev)# 

Fügen Sie den folgenden Code am Ende Ihres ~ / .bashrc hinzu

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
Ali Alp
quelle