Jak wyświetlić bieżącą ścieżkę w wierszu poleceń w sh Linuksa (nie bash)?


43

Chciałbym wyświetlić bieżącą ścieżkę w wierszu polecenia sh (bez powłoki bash), która obecnie pokazuje tylko „#”, próbowałem z wprowadzeniem tego

env PS1="$(whoami)@$(hostname):$(pwd)"

i

set PS1="$(whoami)@$(hostname):$(pwd)"

w /etc/profile.

Ale to oczywiste, że nie odświeża się po zmianie katalogu lub zmianie użytkownika. Proszę zasugerować sposób, aby uczynić to dynamicznym.


1
Zauważ, że każdy $()uruchamia osobny program; byłoby szybciej używać zmiennych środowiskowych, takich jak $LOGNAME, $HOSTNAMEi $PWDzamiast tego.
grawitacja

Jedną z odpowiedzi było użycie pojedynczych cudzysłowów zamiast podwójnych cudzysłowów, ale to całkiem pełna poprawna odpowiedź. To, co naprawdę chcesz zrobić, to odroczyć ocenę kodu w zachęcie, aż zostanie użyty.
MaasSql

Wystarczy użyć eksportu „PS1 =” $ (whoami) @ $ (nazwa hosta): $ (pwd)> ”, a następnie edytować plik / etc / profile i dołączyć ten wiersz na końcu.
SDsolar

Odpowiedzi:


76

Podstawienia poleceń w podwójnych cudzysłowach "są natychmiast rozszerzane. To nie jest to, czego oczekujesz. Pojedyncze cudzysłowy 'zachowają podstawienia, w $PS1których następnie są rozwijane tylko podczas wyświetlania monitu. Dlatego powinno to działać:

export PS1='$(whoami)@$(hostname):$(pwd)'

Jeśli chcesz zwykły znak dolara i spację na końcu monitu, po prostu dodaj $na końcu (nie jest konieczne ucieczka):export PS1='$(whoami)@$(hostname):$(pwd)$ '


1
Po zmianie „ustaw” na „eksportuj” w odpowiedzi zadziałało jak urok. Zapisałem export PS1='$(whoami)@$(hostname):$(pwd)$'zmiany w /etc/profile. Dziękuję Ci.
Bleamer

@Bleamer: setpracował dla mnie (ale nie miałem ojczystego sh). Ale zmienię go exportna zgodny z twoją konfiguracją.
mpy

2
Czy jest jakiś sposób, aby uczynić to trwałym? Obecnie muszę to robić przy każdym logowaniu. Dzięki!
the.ufon

3
Umieściłeś ten wiersz w /etc/profile(patrz pytanie) lub ~/.profile?!
mpy

+1, to jednak będzie wymagać ogranicznika na końcu. W tej chwili dostajesz coś takiego jak foo@localhost:/home/fools -lapodczas korzystania ls -la.
fresnel

12
sh-4.2$ export PS1="\u@\h:\w>"
jenny@serenity:~>cd /usr/local
jenny@serenity:/usr/local>

1
Obawiam się, że działa dla powłoki bash nie dla sh, kiedy to robię, otrzymuję \u@\h:\w>jako
wiersz

1
Musi być inna wersja sh; jak widać z pierwszej linii, zadziałało dla mnie w wersji 4.2.
Jenny D

1
Tak może być. Ta skorupa pochodzi z Busy Box. Dziękuję Ci. Doceń jednak swoją pomoc.
Bleamer

@Bleamer, działa dla mnie z BusyBox v1.19.4 built-in shell (ash).
cjm

Dziękuję za odpowiedź @cjm, ale uniknę zagłębiania się w to.
Bleamer

5

To polecenie działa dla mnie.

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

Gdzie
\ u = nazwa użytkownika
\ h
= nazwa hosta \ W Nazwa bieżącego folderu (niepełna ścieżka)


+1 dla parametru \ W
Dimitry K

3

Można rozważyć ulepszenie monitu przez dodanie kilku kolorów. Na przykład:

export PS1='\[\e[0;36m\]\u\[\e[0m\]@\[\e[0;33m\]\h\[\e[0m\]:\[\e[0;35m\]\w\[\e[0m\]\$ '

1
Właśnie tego szukałem. Mam nadzieję, że wszyscy lubią kolory w życiu :)
Govind Kailas

Przynajmniej ja tak. ;)
Arvid

1

Jedną z odpowiedzi było użycie pojedynczych cudzysłowów zamiast podwójnych, jednak nie jest to pełna poprawna odpowiedź. To, co naprawdę chcesz zrobić, to odroczyć ocenę kodu w zachęcie, aż zostanie użyty.

set PS1="$(pwd)" 

ustawia monit do katalogu roboczego zgodnie z poleceniem set.

set PS1="\$(pwd)" 

NIE rozwija $ (pwd). Zamiast tego PS1 jest ustawiony na literalną wartość $ (pwd).

Przetestuj / zrozum to, uruchamiając:

echo $PS1

. Jeśli zobaczysz ciąg: $ pwd, Twój monit działa. Jeśli widzisz literalną ścieżkę, monit jest przerywany, ponieważ został ustawiony statycznie


1

Użyj poniższego polecenia, aby ustawić jak w panelu.

eksport PS1='$(whoami)@${HOSTNAME%%.*} [$ (pwd)] # '


Dzięki! Żadna z powyższych opcji nie zadziałała. Ten zrobił. Doprowadzał mnie do szału. Dzięki za uratowanie mojego zdrowia psychicznego. HA!
Lee_Str
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.