Jestem nowy w bash i chciałbym, aby mój monit pokazał coś, co w tcsh było trywialne, ale po dobrej wyszukiwarce google nadal nie mogę tego zrobić.
Chciałbym, aby mój monit zawierał tylko katalogi bieżący i nadrzędny w następujący sposób:
/parent/currentdir $
W tcsh osiąga się to poprzez:
set prompt = "%C2 %"
Jednak w bash jak dotąd odkryłem tylko, że muszę parsować pwd, aby uzyskać ten sam wynik.
Czy nie ma prostszego sposobu, na przykład:
export PS1="$(some_command) $"
PS1='\w \$'; PROMPT_DIRTRIM=2
powinien dać ci odpowiednik bash, ale to nie działa poprawnie w moim systemie.PROMPT_DIRTRIM
został wprowadzony w Bash 4 . Właśnie przetestowałem na Ubuntu 16.04 pod WSL i działało świetnie!Odpowiedzi:
Funkcje szybkiego sterowania Bash są raczej statyczne. Jeśli chcesz mieć większą kontrolę, możesz dołączyć zmienne do swojego monitu; upewnij się, że nie wyłączyłeś tej
promptvars
opcji .Zwróć uwagę na pojedyncze cudzysłowy: rozwinięcie zmiennej musi nastąpić w momencie wyświetlenia monitu, a nie w momencie
PS1
definiowania zmiennej.Jeśli chcesz mieć większą kontrolę nad tym, co jest wyświetlane, możesz użyć zastępowania poleceń. Na przykład powyższy fragment
~
kodu traci skrót do katalogu domowego.Ten kod jest raczej kłopotliwy, więc zamiast wtykać go w
PS1
zmienną, możesz użyć tejPROMPT_COMMAND
zmiennej do uruchomienia kodu, aby ustawić,HPWD
a następnie użyć go w wierszu polecenia.Ponieważ skrócony monit zmienił się tylko przy zmianie katalogu, nie trzeba go ponownie obliczać za każdym razem, gdy wyświetlany jest monit. Bash nie zapewnia przechwytywania, które działa na bieżącej zmianie katalogu, ale możesz to zasymulować, zastępując
cd
i jego kuzynów.Zauważ, że nie musisz i nie powinieneś eksportować
PS1
, ponieważ jest to ustawienie powłoki, a nie zmienna środowiskowa.PS1
Ustawienie bash nie byłoby zrozumiałe dla innych powłok.PS Jeśli chcesz miłej interaktywnej powłoki, przełącz się na zsh , gdzie wszystkie z nich (szybkie
%
rozszerzenia w dużej mierze obejmujące tcshchpwd
itp.) Są natywnymi funkcjami.źródło
Składnia uzyskiwania katalogów nadrzędnych i bieżących pochodzi z odpowiedzi Munai .
Jednak, jak zauważył Gilles, ten kod pokazuje tylko bieżący katalog w chwili
.bashrc
załadowania, ale nie zmieni się podczas nawigacji systemu do innych folderów.Umieszczenie tego w
.bashrc
pliku powoduje, że monit zostanie automatycznie zaktualizowany do bieżącego katalogu:źródło
prompt_command()
powinno samo w sobie coś zrobić? To nie dla mnie. Czy miałeś na myśli użycie równieżprompt_command()
w redefinicjachcd
& co, tak jak zrobił to Gilles? A może miałeś na myśliPROMPT_COMMAND='...'
?$PWD
zawiera spację./
? Jak napisano, dostajesz/// $
Wiersz zachęty można łatwo zmienić
bash
, edytując zmienną powłokiPS1
. Oznacza Monit 1. Ciągu. Więcej informacji tutaj .Na razie odpal swój
bash
pocisk.vi ~/.bashrc
Dołącz definicję PS1 do pliku
Więcej samouczków tutaj i tutaj , aby pomóc Ci jeszcze bardziej go ulepszyć.
źródło
.bashrc
wczytywania. Monit nie zmieni się, jeśli przejdzieszcd
do innego katalogu! @twalbaumMoże być prostszy z „~” dla katalogu domowego.
źródło
źródło
Ustawienie
PROMPT_DIRTRIM=2
powinno być wszystkim, czego potrzebujesz.źródło