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 do bash
:
cd somedir
- zmień katalog na
somedir
- zapisz oryginalny katalog w
OLDPWD
- zestaw
PWD="somedir"
- zamień górny element stosu katalogu (jak pokazano przez
dirs
) na somedir
(liczba elementów na stosie nie zmienia się).
cd -
:
- zmień katalog na
$OLDPWD
- Zamień wartości
PWD
iOLDPWD
- zmodyfikuj górny element stosu katalogów, aby odzwierciedlał (nowy)
PWD
pushd somedir
:
- zmień katalog na
somedir
- zapisz oryginalny katalog w
OLDPWD
- zestaw
PWD="somedir"
- push
somedir
na stos katalogów (rozszerzając go o jeden element)
popd
:
- zapisz oryginalny katalog w
OLDPWD
- usuń pierwszy element ze stosu katalogów
- zmień katalog na nowy górny element stosu katalogów
- ustawiony
PWD
na nowy najwyższy element stosu katalogów
Uwaga: To, czy obecny katalog roboczy jest uważany za element stosu katalogów, różni się między zsh
i bash
. Użyłem bash
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:
pushd [-n] [dir]
[…] Dodaje dir
do stosu katalogów u góry, czyniąc go nowym bieżącym katalogiem roboczym, tak jakby został dostarczony jako argument do cd
wbudowanego. […]
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:
pushd [ -qsLP ] [ arg ]
[…] Zmień bieżący katalog i wsuń stary bieżący katalog na stos katalogów. W pierwszej formie zmień bieżący katalog na arg. […]
Drukowanie dirstack
( echo ${dirstack[@]}
) i porównywanie go z wyjściem dirs
powinno pokazać, że PWD
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 indeksem 1
odnosi się do katalogu, który był aktualny przed ostatnim pushd
. To dlatego, że w tablice zsh
są zazwyczaj ponumerowane od 1
, podczas gdy są one ponumerowane od 0
w bash
. Więc nie ma praktycznej różnicy
Jak wspomniano powyżej, to zachowanie można zmodyfikować w zsh
.
Jeśli ustawisz AUTO_PUSHD
opcję w zsh
( setopt autopushd
) cd somedir
zachowuje się tak pushd 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ź, czy autopushd
pojawia się na liście.
Ale to nie zmienia cd -
się tak, aby zachowywać się jak popd
. Zamiast tego po prostu wypycha $PWD
na stos katalogów i zmienia katalog na $OLDPWD
. Oznacza to, że wielokrotne wywoływanie cd -
spowoduje wzrost stosu katalogów ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)
). Jeśli faktycznie zachowuje się dokładnie tak, jak popd
w twoim systemie, sugerowałbym, czy cd
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 parametr DIRSTACKSIZE
na żądany maksymalny rozmiar.
Można również zapobiec duplikatom, ustawiając tę PUSHD_IGNORE_DUPS
opcję.
Więcej opcji znajdziesz w instrukcji .
cd
ustawia zmienną powłokiOLDPWD
na poprzedni katalog icd -
zostaje przetłumaczony nacd "$OLDPWD"
.