dra*_*ang 28 bash zsh cd-command pushd
bash 与 zsh 中 pushd/popd 的行为有区别吗?似乎在 zsh cd 中,cd- 的行为与 pushd/popd(在 cd 时自动添加/pops 目录)完全相同,而在 bash 中 cd 不影响目录堆栈。
如果有人能给我一个指针,那就太好了。
Ada*_*hon 31
这取决于。在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
指的是在最后一个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
选项来防止重复。
有关更多选项,请查看手册。
归档时间: |
|
查看次数: |
27771 次 |
最近记录: |