Abgekürztes aktuelles Verzeichnis in der Shell-Eingabeaufforderung?


23

vim hat ein wirklich nettes Feature, das es in seinen Pfaden nutzt, wenn sie etwas lang sind:

Bildbeschreibung hier eingeben

Es verkürzt den Pfad zum Dokument auf der Registerkarte oben. Gibt es eine Möglichkeit, etwas Ähnliches zu tun, so dass meine Bash-Eingabeaufforderung nicht so aussieht:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
Also, was willst du rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? Idealerweise einen Schwellenwert für die maximale Länge der Eingabeaufforderung verwenden?
Nicerobot

Genau das suche ich.
Naftuli Kay

Ok, ich habe meine Antwort gegeben.
Nicerobot

Antworten:


14

Versuchen Sie dies :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

oder, pure bash:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

dann

PS1='\u@\h ${PS1X} $ '

produziert (beachte das ~für ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

Ich habe meine Antwort dank @ enzotib's verbessert


1
Können Sie ein Beispiel dafür geben, wie dies als Aufforderung für die Nachwelt aussehen würde?
Naftuli Kay

(0) Dein Github-Link ist kaputt. (1) Vielleicht möchten Sie sich den $PWD~Test genauer ansehen . Derzeit, wenn HOMEist /home/edund PWDist /home/edwina, erhalten Sie ~winain der Perl-Version und ~/inain der Shell-Version. (2) Ihr Shell-Code drosselt, wenn das aktuelle Verzeichnis Platzhalterzeichen (dh Pfadnamenerweiterungszeichen) enthält. zB PWD= /abc/*/def. Sie können dies beheben, indem Sie set -o nogloboder hinzufügen set -f. … (Fortsetzung)
G-Man sagt, dass Monica am

(Fortsetzung)… (3) Sie brauchen nicht annähernd so viele Zahnspangen. Im Perl-Befehl $HOME(der in doppelten Anführungszeichen steht) und $PWDsind gut genug. In dem Shell - Befehl, die letzten drei Shell - Variablenreferenzen sind in Ordnung, aber die ersten drei sein können "${PWD#$HOME}", "$PWD"und "$p". (4) Siehe auch die Antwort von mbentley und meine Kommentare dazu.
G-Man sagt, dass Monica am

15

Ähnlich wie @nicerobot, aber etwas kürzer:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

Dies zeigt die folgende Beispielausgabe:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

Ich mag PROMPT_DIRTRIMin bash ...

export PROMPT_DIRTRIM=2

Ändert die Eingabeaufforderung Ihres Beispiels in ...

rfkrocktk@work-laptop ../com/tkassembled/ $

Für mich geht das.


Tut nicht das, wonach er gefragt hat, aber danke, dass Sie mich über die Funktion informiert haben.
Nicerobot

3
@nicerobot Ja, du hattest die richtige Antwort. :) Ich weiß, dass es nicht die Abkürzung gibt, nach der er gefragt hat, aber oft ändern sich unsere Erwartungen, wenn wir einfache Optionen sehen. Außerdem ist es Standard, und als solches hatte ich das Gefühl, dass es eine Erwähnung verdient.
BentFX

1
Ich bin der Meinung, dass eine der Funktionen von SE darin besteht, nicht nur die perfekte Antwort auf die Frage zu liefern, sondern auch andere Optionen für das OP und andere bereitzustellen, die die Frage durch Suchen finden. Beachten Sie den Antwortkontext, den ich bereitgestellt habe "Ich mag ... arbeitet für mich." Dennoch glauben einige, dass es eine Abwahl verdient.
BentFX

Ich neige dazu, dass Antworten, die die Frage nicht direkt beantworten, abgelehnt werden, aber ich stimme Ihnen zu, dass das Bereitstellen von Alternativen eine gültige Antwort oder Antwort sein kann .
nicerobot

Die Antwort von BentFX beantwortet nicht die Frage des OP als Ganzes, sondern genau das Thema. Abgekürztes aktuelles Verzeichnis in der Shell-Eingabeaufforderung? Das ist für wahrscheinlich die meisten Besucher dieses Themas genau das, wonach sie suchen.
TNT

4

Das folgende Snippet ergänzt die Antwort von enzotib :

  1. Konvertieren /Path/To/Your/Home/nach ~/(so wird ein Pfad ~/a/b/cstatt /P/T/Y/H/a/b/c)
  2. Verwenden Sie den ersten Buchstaben einer Punktdatei, anstatt nur den Punkt anzuzeigen ( /a/./c/dwird zu /a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

Stellen Sie sicher, dass Sie einfache Anführungszeichen verwenden, da diese sonst vorzeitig erweitert werden.


3

Das Format für die Verwendung in Ihrem PS1ist \W(siehe PROMPTINGAbschnitt in der bashManpage).

PS1="\u@\h \W\$ "

Und wenn Sie die anderen Optionen dort lesen möchten, können Sie einige coole Dinge mit Ihrer Befehlszeile tun.


2
Ich denke, dass \ W überhaupt nicht tut, was er verlangt.
Nicerobot

1
@nicerobot Es wird nicht die erste Initiale jeder Komponente des Pfads angegeben, aber das aktuelle Arbeitsverzeichnis wird kürzer angegeben. Ich bin mir ziemlich sicher, dass es nicht möglich ist, das Verzeichnis auf diese Weise abzukürzen, ohne ein ziemlich hässliches Skript zu verwenden, das bei jeder Eingabeaufforderung ausgeführt wird. Wir werden sehen, was er dazu zu sagen hat.
Kevin

1

Ich liebe die Ausgabe von Nicerobots Beispiel, aber ich habe ein Problem gefunden. Ich habe ein Verzeichnis mit einem Bindestrich A-Eund es wurde -Eals Argument dafür angesehen, printfwann es mein aktuelles Arbeitsverzeichnis war. Um dieses Problem zu beheben, habe ich --den letzten printfhinzugefügt und Anführungszeichen um die Ausgabe hinzugefügt, falls nichts auszugeben ist:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1) Guter Fang bei der Ausgabe des Verzeichnisnamens, der -als zweites Zeichen enthält. Während es wahr ist, dass dies --die allgemeine Lösung für das Problem der Argumente ist, die mit beginnen -, ist es eine bessere Methode , dies printfzu sagen printf "%s" "${q:1}", da dies auch vor Argumenten schützt, die enthalten %. (Versuchen Sie zum Beispiel PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Siehe auch meine Kommentare zur Antwort von nicerobot.
G-Man sagt, dass Monica am
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.