bash与zsh中push / popd的行为之间有区别吗?在zsh cd中,cd-的行为与push / popd(在cd时会自动添加/ pops目录)完全相同,而在bash cd中则不会影响目录堆栈。
如果有人可以给我一个指针,那将是很好。
pushd
还设定了OLDPWD
dirs
始终将PWD作为第一个元素
bash与zsh中push / popd的行为之间有区别吗?在zsh cd中,cd-的行为与push / popd(在cd时会自动添加/ pops目录)完全相同,而在bash cd中则不会影响目录堆栈。
如果有人可以给我一个指针,那将是很好。
pushd
还设定了OLDPWD
dirs
始终将PWD作为第一个元素
Answers:
这取决于。在中,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
为目录堆栈的新的top元素注意:和之间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
。这是因为in zsh
中的数组通常从中编号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
您的系统上的行为完全一样,我建议您是否cd
实际上是内置的(whence -v cd
); 很有可能将其替换为别名或函数。
由于AUTO_PUSHD
启用后目录堆栈将快速增长,因此可以通过将参数设置DIRSTACKSIZE
为所需的最大大小来限制其大小。
您还可以通过设置PUSHD_IGNORE_DUPS
选项来防止重复。
有关更多选项,请参阅手册。
dirs
?
popd
而无需键入(甚至不知道)路径。
cd
将shell变量OLDPWD
设置为上一个目录,并cd -
转换为cd "$OLDPWD"
。