Zeigt nur den aktuellen Verzeichnisnamen (nicht den vollständigen Pfad) an der Bash-Eingabeaufforderung an

78661
hsribei

So wie meine Bash-Eingabeaufforderung derzeit konfiguriert ist, wird der gesamte Pfad zum aktuellen Verzeichnis angezeigt. Dies ist ärgerlich, wenn ich mich tief in einer Verzeichnisstruktur befinde, da die Aufforderung so lang wird, dass jeder Befehl in die nächste Zeile eingefügt wird. Wie kann ich nur den letzten Teil des Pfads anzeigen lassen?

Das habe ich in meinem .bashrc:

PS1='$\[\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;$@$: $\007"' ;; *) ;; esac 
65

6 Antworten auf die Frage

85
quack quixote

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

PS1='$\[\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 $\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$   user@host:/usr/local/bin$ export PS1='$\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '  user@host:bin$ 

Die PROMPT_COMMANDVariable, falls gesetzt, ist 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 bearbeiten .

Wenn Sie den Verdacht haben, dass Sie PROMPT_COMMANDIhre PS1Eingabeaufforderung überschreiben, können Sie dies unsettun und Dinge testen:

$ unset PROMPT_COMMAND 

Stellen Sie schließlich sicher, dass Sie die PS1Definition ändern, die tatsächlich verwendet wird. 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.

Hm ... Ich befürchte, es ist bereits \ w, aber es scheint, als ob die "case" -Anweisung es überschreibt, wenn ich mich auf einem X-Term befinde. Das Problem scheint mit der "PWD" in der `PROMPT_COMMAND'-Zeile zu sein. Weißt du, was ich da setzen sollte? hsribei vor 15 Jahren 0
`\ w` (Kleinbuchstaben) setzt es auf vollen Pfad,` \ W` (Großbuchstaben) trimmt auf das letzte Bit. PROMPT_COMMAND setzt den Fenstertitel in einem Xterm. Überprüfen Sie Ihre TERM-Variable. Wenn es nicht mit "xterm" oder "rxvt" * beginnt *, wird PROMPT_COMMAND nicht einmal ausgeführt. quack quixote vor 15 Jahren 4
Oh ja, duh. Entschuldigung, ich habe Groß- und Kleinschreibung gemischt. Das hat funktioniert. Vielen Dank! :) hsribei vor 15 Jahren 0
Gute Antwort. Stellen Sie sicher, dass Sie einen Neustart durchführen, damit dies wirksam wird. Vielen Dank! Combine vor 6 Jahren 0
11
stopBugs

Ein einfacher Befehl zum Ersetzen der Bash ist

$ 

Um das letzte Verzeichnis anzuzeigen, können Sie es einfach tun $, dh alles vor und einschließlich des letzten ' /' finden und durch nichts ersetzen.

Auf meinem Ubuntu-Rechner verwende ich:

export PS1='$(whoami):$#'. 
Nur sechs Jahre später! Burgi vor 8 Jahren 5
Diese Antwort gefällt mir besser als die akzeptierte, weil sie generisch für jede Situation ist und nicht nur die spezielle Parsing-Logik von $ PS1. Weniger leistungsfähigere Werkzeuge sind einfacher zu merken und zu komponieren. :) David Ellis vor 6 Jahren 0
3
Michael Durrant

Meine Lösung ist, die oberen drei und unteren 2 Verzeichnisse anzuzeigen, wenn mehr als fünf vorhanden sind

So sieht meine Aufforderung (die auch andere Informationen hat) 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 ist 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_\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 es in meinen dotfiles, es ist:

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

Meine Lösung dafür ist etwas anders in Bezug darauf, wie ich es exportiere. Ich dachte, ich würde es hier teilen:

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

\ u : Zeigt den aktuellen Benutzernamen an.

\ W : Die Basis des aktuellen Arbeitsverzeichnisses drucken.

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

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


Oder noch besser: Erstellen Sie einen Alias ​​in Ihrer .bash_aliasesDatei: (Danke an @muru )

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

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

Das sieht aus wie ein Frankenalias. Warum nicht einfach einen Alias ​​oder eine Funktion verwenden? muru vor 6 Jahren 1
@muru Danke, das ist viel besser, die Antwort wurde aktualisiert. U-ways vor 6 Jahren 0
1
Gray

Zeigt nur den aktuellen Verzeichnisnamen (nicht den vollständigen Pfad) an der Bash-Eingabeaufforderung an

Die meisten anderen Lösungen funktionierten für mich nicht in allen Betriebssystemen, die meine Dot-Dateien 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.

Folgendes 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 $ done } export PS1="\$(DIR_LAST 2) {$(hostname)} " 

Ich will es ausspucken:

/ /usr /usr/foo foo/bin 

Beachten Sie das Fehlen eines führenden Schrägstrichs in der letzten Zeile, der 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 einem Regex zu tun, BASH_REMATCHaber bash v3 schien die Parens nicht zu mögen und ich konnte nicht herausfinden, wie ich ihnen richtig entkommen kann. Seufzer.

0
Mean Developr

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

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

Weisen Sie also die PS1-Variable in Ihrer .bashrc-Datei zu:

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