pushd, popd vs cd, cd- in bash i zsh

16

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.

dragonxlwang
źródło
Mogę mówić tylko do bash: używając cdustawia zmienną powłoki OLDPWDna poprzedni katalog i cd -zostaje przetłumaczony na cd "$OLDPWD".
glenn jackman
@glennjackman, dzięki. Czy to oznacza, że ​​w bash cd nie ma nic wspólnego z / pushd / popd?
dragonxlwang
Właśnie sprawdziłem, a pushdtakże ustawiaOLDPWD
glenn jackman
A dirstack, zwracany przez, dirszawsze zawiera PWD jako pierwszy element
glenn jackman
tak, ale ma to również sens, jeśli cd nie dotyka stosów dir, którymi zarządza pushd / popd w bash.
dragonxlwang

Odpowiedzi:

17

To zależy. W zshmożna skonfigurować cddo pchania starego katalogu do katalogu stos automatycznie, ale to ustawienie domyślne nie jest.

O ile mogę stwierdzić zshprzy 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 PWDiOLDPWD
    • 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 somedirna 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 PWDna 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 zshi bash. Użyłem bashjako odniesienia do powyższych list.

  • W bashobecnym katalogu roboczym jest uważany za najwyższy element stosu katalogów. man 1 bashMówi:

    pushd [-n] [dir]

    […] Dodaje dirdo stosu katalogów u góry, czyniąc go nowym bieżącym katalogiem roboczym, tak jakby został dostarczony jako argument do cdwbudowanego. […]

    Drukowanie DIRSTACK( echo ${dirstack[@]}) potwierdza, że ​​pierwszy element jest identyczny $PWD.

  • W zshobecnym katalogu roboczym nie jest częścią stosu katalogów (ale nadal jest pokazany za pomocą dirs). man 1 zshbuiltinsmó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 dirspowinno pokazać, że PWDnie jest on częścią `dirstack.

W obu powłokach dirsdrukuje obecny katalog roboczy jako pierwszy element. Również w obu powłokach element stosu katalogów z indeksem 1odnosi się do katalogu, który był aktualny przed ostatnim pushd. To dlatego, że w tablice zshsą zazwyczaj ponumerowane od 1, podczas gdy są one ponumerowane od 0w bash. Więc nie ma praktycznej różnicy


Jak wspomniano powyżej, to zachowanie można zmodyfikować w zsh.

Jeśli ustawisz AUTO_PUSHDopcję w zsh( setopt autopushd) cd somedirzachowuje się tak pushd somedir, poprzedni katalog jest automatycznie wypychany na stos katalogów. Prawdopodobnie dzieje się tak na twoim komputerze. Możesz uruchomić, setoptaby uzyskać listę opcji, które nie są ustawione domyślnie. Sprawdź, czy autopushdpojawia się na liście.

Ale to nie zmienia cd -się tak, aby zachowywać się jak popd. Zamiast tego po prostu wypycha $PWDna 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 popdw twoim systemie, sugerowałbym, czy cdtak 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_PUSHDwłączeniu, możesz ograniczyć jego rozmiar, ustawiając parametr DIRSTACKSIZEna żądany maksymalny rozmiar.
Można również zapobiec duplikatom, ustawiając tę PUSHD_IGNORE_DUPSopcję.
Więcej opcji znajdziesz w instrukcji .

Adaefon
źródło
jaki jest cel stosu katalogów poza przeglądaniem go przez dirs?
Xerus
@ Xerus Umożliwia powrót do poprzednio odwiedzanych katalogów popdbez konieczności wpisywania (a nawet znajomości) ścieżki.
Adaephon