Jak mogę skrócić bieżącą ścieżkę zachęty bash do jednej litery na katalog?

9

Nie pamiętam gdzie, ale już widziałem, że bieżąca ścieżka zachęty została skrócona w interesujący sposób: każdy katalog zawarty na ścieżce (oprócz ostatniego) jest zastępowany tylko pierwszą literą. Na przykład: path/to/some/directoryzostanie skrócony do p/t/s/directory.

Jak mogę odtworzyć to zachowanie?

Anto
źródło
Nie możesz tego zrobić bezpośrednio w PS1. Musisz ustawić, PS1aby zawierał zmienną ( PS1='${SHORT_PWD}\\$') i aktualizował tę zmienną w $PROMPT_COMMAND.
Gilles „SO- przestań być zły”
@Gilles „SO- przestań być zły” na pewno możesz to zrobić bezpośrednio, jeśli użyjesz podwójnego cudzysłowu, musisz \$()jednak
cofnąć

Odpowiedzi:

8

Po dłuższej zabawie z tym otrzymałem odpowiedź, której potrzebujesz:

Dodaj to do pliku .bashrc w katalogu domowym, zamknij terminal i wypożyczyć go, a otrzymasz monit.

PS1='$(eval "sps")$ '
sps() {
   echo "$PWD" | sed -r 's|/([^/]{,2})[^/]*|/\1|g'
}

Używa zadeklarowanej funkcji sps()do oceny ścieżki za każdym razem, gdy PS1wyświetlana jest zmienna będąca pytaniem

to znaczy

/ho/de/De/Ap/Ti$ pwd
/home/deth/Desktop/Apps/Tivo
/ho/de/De/Ap/Ti$ 

Lub ... jeśli nalegasz na jedną literę

PS1='$(eval "sps")$ '
sps() {
   echo "$PWD" | sed -r 's|/(.)[^/]*|/\1|g'
}

Który wyświetla:

/h/d/D/A/T$ pwd
/home/deth/Desktop/Apps/Tivo
/h/d/D/A/T$ 
Meer Borg
źródło
Dziękuję Meer. Mój monit w rzeczywistości polega na usunięciu user@pcczęści. Jak sobie z tym poradzić?
Alex
3

Aby obciąć wszystkie nazwy katalogów oprócz ostatniej:

PS1='$(eval "sps")$ '                                                                                
sps() {                                                                                              
    python -c "import sys; dirs = sys.argv[1].split('/'); print '/'.join(d[:1] for d in dirs[:-1]) + '/' + dirs[-1]" $PWD
}
Askory
źródło
To nie działa, gdy zmieniam katalogi?
Aditya Varma
1

skróć wszystkie nazwiska oprócz ostatniego bez Pythona:

user:/h/u/D/C/current$ 
sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}
PS1='\u:$$(eval "sps")/\W\$ '
Travis S.
źródło