Bash

bash 和 zsh 中的 pushd、popd 與 cd、cd-

  • April 3, 2016

bash 和 zsh 中 pushd/popd 的行為有區別嗎?在 zsh cd 中,cd- 的行為似乎與 pushd/popd 完全相同(在 cd 時會自動添加/pops 目錄),而在 bash 中 cd 不會影響 dir 堆棧。

如果有人可以給我一個指針,那就太好了。

這取決於。zsh您可以配置自動將舊目錄推送到目錄堆棧上,cd但這不是預設設置。

據我所知zsh,預設設置的行為非常類似於bash

  • cd somedir

    • 將目錄更改為somedir
    • 將原始目錄保存在OLDPWD
    • PWD="somedir"
    • 將目錄堆棧的頂部元素(如 所示dirs)替換為somedir(堆棧上的元素數量不變)。
  • cd -:

    • 將目錄更改為$OLDPWD
    • PWD和的交換值OLDPWD
    • 修改目錄堆棧的頂部元素以反映(新)PWD
  • pushd somedir:

    • 將目錄更改為somedir
    • 將原始目錄保存在OLDPWD
    • PWD="somedir"
    • 推入somedir目錄堆棧(將其擴展一個元素)
  • popd:

    • 將原始目錄保存在OLDPWD
    • 刪除目錄堆棧的第一個元素
    • 將目錄更改為目錄堆棧的新頂部元素
    • 設置PWD為目錄堆棧的新頂部元素

注意:zsh目前工作目錄是否被視為目錄堆棧的元素在和之間有所不同bash。我用作bash上述列表的參考。

  • bash目前工作目錄中被認為是目錄堆棧的頂部元素。man 1 bash說:

pushd [-n] [dir]

$$ … $$添加dir到頂部的目錄堆棧,使其成為新的目前工作目錄,就好像它已作為參數提供給cd內置函式一樣。$$ … $$

列印DIRSTACK( echo ${dirstack[@]}) 確認第一個元素與 相同$PWD

  • zsh目前工作目錄中不是目錄堆棧的一部分(但仍顯示為dirs)。man 1 zshbuiltins說:

pushd [ -qsLP ] [ arg ]

$$ … $$更改目前目錄,並將舊的目前目錄推送到目錄堆棧上。在第一種形式中,將目前目錄更改為 arg。$$ … $$

列印dirstack( echo ${dirstack[@]}) 並將其與 的輸出進行比較dirs應該表明PWD不是 `dirstack.

在兩個 shell中都dirs將目前工作目錄列印為第一個元素。同樣在這兩個 shell 中,帶有索引的目錄堆棧元素1指的是在 last 之前的目前目錄pushd。這是因為數組 inzsh通常從 編號1,而它們從0in編號bash。所以實際差別不大


如上所述,這種行為可以在zsh.

如果在( )中設置AUTO_PUSHD選項的行為類似於,則會自動將上一個目錄推送到目錄堆棧中。您的機器上可能就是這種情況。您可以執行以獲取未設置預設方式的選項列表。看,是否出現在列表中。zsh``setopt autopushd``cd somedir``pushd somedir``setopt``autopushd

但這不會修改cd -popd. 相反,它只是推$PWD入目錄堆棧,並將目錄更改為$OLDPWD. 這意味著重複呼叫cd -實際上會增加目錄堆棧(($PWD $OLDPWD $PWD $OLDPWD $PWD …))。如果它的行為確實與popd您的系統上完全一樣,我會建議 ifcd實際上是內置的 ( whence -v cd); 有可能將其替換為別名或函式。

由於啟用後目錄堆棧將很快增長AUTO_PUSHD,您可以通過將參數設置DIRSTACKSIZE為所需的最大大小來限制其大小。

您還可以通過設置PUSHD_IGNORE_DUPS選項來防止重複。

有關更多選項,請查看手冊

引用自:https://unix.stackexchange.com/questions/272965