Jak wyświetlić bezwzględną ścieżkę w monicie bash?

50

Obecnie mam bash PS1ustawiony na coś takiego:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\w\n\$ "

Jak sprawić, by pokazywała ścieżkę bezwzględną zamiast względnej (np. /home/dave/dirZamiast ~/dir)?

David B.
źródło
1
/home/dave/diri ~/dirobie są ścieżkami bezwzględnymi, drugi używa skrótu do twojego katalogu domowego. Ścieżka względna to ścieżka względna do bieżącego katalogu (np. ../dir), A nie zaczynająca się od root ( /).
Doug Harris
3
ps Ładne użycie koloru do wskazania statusu wyjścia poprzedniego polecenia. Prawdopodobnie pierwsze użycie koloru w znaku zachęty, który mi się podobał.
Doug Harris
@Doug Harris: Dzięki za korektę. Ja też lubię tę kolorystykę. Nie pamiętam, gdzie go po raz pierwszy zobaczyłem (może w jakimś poprzednim poście SU?)
David B
\u@\H[\w]:~\$robiuser@host[~/path]:~$
JREAM

Odpowiedzi:

49

Wystarczy wymienić \wz \$PWD:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\$PWD\n\$ "

W każdym razie, jeśli masz coś przeciwko małej wskazówce, napisałbym coś takiego:

PS1='\[`[ $? = 0 ] && X=2 || X=1; tput setaf $X`\]\h\[`tput sgr0`\]:$PWD\n\$ '
Cyrus
źródło
4
Też o tym myślałem, ale $PWDjest on oceniany w momencie przypisania do PS1, a nie przy każdym połączeniu. Jednakże , jeśli można uciec znak dolara, to będzie działać - \$PWD. Dzięki temu znak dolara jest znakiem dolara w momencie przypisania, a ocena zmiennej odbywa się przy każdym znaku zachęty. +1 dla ciebie.
Doug Harris
Racja, przegapiłem \, zazwyczaj pracuję z pojedynczymi cudzysłowami, jeśli to możliwe. Dzięki.
crus
+1 dzięki! czy mógłbyś wyjaśnić magię w swojej pięknej linii bash („tip”)?
David B
Pewnie. Użyłem tput (zobacz man tput, aby uzyskać więcej informacji), aby zmienić kolory, zamiast pisać bezpośrednio znaki sterujące, w celu zapewnienia czytelności i przenośności (?). Usunąłem także podwójne cudzysłowy i ukośniki odwrotne, używając pojedynczych cudzysłowów. Wreszcie, używając zmiennej, uniknąłem nadmiarowości.
crus
23

Umieść w swoim domu .bashrc

PS1='\u@\h:\w\$ '
Alex
źródło
7
Kluczem tutaj jest \wpełna ścieżka, a \Wtylko katalog. Zobacz „Sekwencje ucieczki Bash Prompt”
zamnuts
0

w ps1 basha; -W powinno być względne i -w absolutne, więc w powyższym przypadku powinieneś już mieć absolut?

http://wiki.archlinux.org/index.php/Color_Bash_Prompt

Sirex
źródło
3
Myślę, że mylisz absolutnego | krewnego z pełnym | bieżącym katalogiem. Wpokazuje tylko bieżącą nazwę katalogu, wpokazuje pełną ścieżkę, ale nadal używa ścieżek względnych.
David B
była terminologia w adresie URL, a nie moja :)
Sirex
0

Humm ~ / dir jest ścieżką absolutną, ale używa „skrótu”. Na przykład, jeśli to zrobisz, cd /usr/localnajprawdopodobniej wyświetli się pełna ścieżka do katalogu / usr / local. W każdym razie masz już pełną ścieżkę :-)

Ale prawdopodobnie twoje poprawne pytanie brzmi: jak wyświetlić pełną ścieżkę bez skrótów takich jak ~?

Jednak nie znam odpowiedzi na to pytanie i patrząc na mężczyznę, wydaje się, że ma jedną (przynajmniej udokumentowaną).

Huygens
źródło
0

Uruchom pwdzamiast używać \W.

Prosta wersja:

export PS1="\`pwd\` $ "

Używając tego w swoim kodzie:

export PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\`pwd\`\n\$ "
Doug Harris
źródło
1
drobna uwaga: zgodnie z przewodnikiem po stylu bash w Google, wolisz $ (pwd) od backticks, ponieważ backticks wymagają ucieczki, gdy nesting i $ () nie.
funroll