Czy istnieje różnica między zachowaniem pushd / popd w bashu a zsh? Wygląda na to, że w zsh cd cd zachowuje się dokładnie tak samo jak pushd / popd (który dodaje katalog / pops automatycznie, gdy cd), podczas gdy w bash cd cd nie wpływa na stos katalogu.
Jeśli ktoś może mi dać wskaźnik, byłoby świetnie.
bash
zsh
cd-command
pushd
dragonxlwang
źródło
źródło
cd
ustawia zmienną powłokiOLDPWD
na poprzedni katalog icd -
zostaje przetłumaczony nacd "$OLDPWD"
.pushd
także ustawiaOLDPWD
dirs
zawsze zawiera PWD jako pierwszy elementOdpowiedzi:
To zależy. W
zsh
można skonfigurowaćcd
do pchania starego katalogu do katalogu stos automatycznie, ale to ustawienie domyślne nie jest.O ile mogę stwierdzić
zsh
przy ustawieniach domyślnych zachowuje się bardzo podobnie dobash
:cd somedir
somedir
OLDPWD
PWD="somedir"
dirs
) nasomedir
(liczba elementów na stosie nie zmienia się).cd -
:$OLDPWD
PWD
iOLDPWD
PWD
pushd somedir
:somedir
OLDPWD
PWD="somedir"
somedir
na stos katalogów (rozszerzając go o jeden element)popd
:OLDPWD
PWD
na nowy najwyższy element stosu katalogówUwaga: To, czy obecny katalog roboczy jest uważany za element stosu katalogów, różni się między
zsh
ibash
. Użyłembash
jako odniesienia do powyższych list.W
bash
obecnym katalogu roboczym jest uważany za najwyższy element stosu katalogów.man 1 bash
Mówi:Drukowanie
DIRSTACK
(echo ${dirstack[@]}
) potwierdza, że pierwszy element jest identyczny$PWD
.W
zsh
obecnym katalogu roboczym nie jest częścią stosu katalogów (ale nadal jest pokazany za pomocądirs
).man 1 zshbuiltins
mówi:Drukowanie
dirstack
(echo ${dirstack[@]}
) i porównywanie go z wyjściemdirs
powinno pokazać, żePWD
nie jest on częścią `dirstack.W obu powłokach
dirs
drukuje obecny katalog roboczy jako pierwszy element. Również w obu powłokach element stosu katalogów z indeksem1
odnosi się do katalogu, który był aktualny przed ostatnimpushd
. To dlatego, że w tablicezsh
są zazwyczaj ponumerowane od1
, podczas gdy są one ponumerowane od0
wbash
. Więc nie ma praktycznej różnicyJak wspomniano powyżej, to zachowanie można zmodyfikować w
zsh
.Jeśli ustawisz
AUTO_PUSHD
opcję wzsh
(setopt autopushd
)cd somedir
zachowuje się takpushd somedir
, poprzedni katalog jest automatycznie wypychany na stos katalogów. Prawdopodobnie dzieje się tak na twoim komputerze. Możesz uruchomić,setopt
aby uzyskać listę opcji, które nie są ustawione domyślnie. Sprawdź, czyautopushd
pojawia się na liście.Ale to nie zmienia
cd -
się tak, aby zachowywać się jakpopd
. Zamiast tego po prostu wypycha$PWD
na stos katalogów i zmienia katalog na$OLDPWD
. Oznacza to, że wielokrotne wywoływaniecd -
spowoduje wzrost stosu katalogów (($PWD $OLDPWD $PWD $OLDPWD $PWD …)
). Jeśli faktycznie zachowuje się dokładnie tak, jakpopd
w twoim systemie, sugerowałbym, czycd
tak naprawdę jest on wbudowany (whence -v cd
); możliwe, że został zastąpiony przez alias lub funkcję.Ponieważ stos katalogów rośnie dość szybko po
AUTO_PUSHD
włączeniu, możesz ograniczyć jego rozmiar, ustawiając parametrDIRSTACKSIZE
na żądany maksymalny rozmiar.Można również zapobiec duplikatom, ustawiając tę
PUSHD_IGNORE_DUPS
opcję.Więcej opcji znajdziesz w instrukcji .
źródło
dirs
?popd
bez konieczności wpisywania (a nawet znajomości) ścieżki.