bash 和 zsh 中的 pushd/popd 的行为有区别吗?在 zsh cd 中,cd- 的行为似乎与 Pushd/popd (在 cd 时自动添加/pops 目录)完全相同,而在 bash 中 cd 不会影响目录堆栈。
如果有人能给我指点,那就太好了。
答案1
这取决于。您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.h 的一部分。
在两个 shelldirs
中,都将当前工作目录打印为第一个元素。此外,在这两个 shell 中,带有索引的目录堆栈元素1
指的是最后一个之前的当前目录pushd
。这是因为 中的数组zsh
通常从 开始编号,而中的1
数组从 开始编号。因此实际区别不大0
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
。
有关更多选项,请查看手册。