bash 和 zsh 中的 pushd、popd 與 cd、cd-
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
,而它們從0
in編號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
選項來防止重複。有關更多選項,請查看手冊。