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.

Bleamer
źródło
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)$ '

mpy
źródło
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>
Jenny D.
źródło
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)

rangsiman
źródło
+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\]\$ '
Arvid
źródło
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

MaasSql
źródło
1

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

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

Mediolan
źródło
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