在bash和zsh中推送,popd与cd,cd-


16

bash与zsh中push / popd的行为之间有区别吗?在zsh cd中,cd-的行为与push / popd(在cd时会自动添加/ pops目录)完全相同,而在bash cd中则不会影响目录堆栈。

如果有人可以给我一个指针,那将是很好。


我只能说bash:使用cd将shell变量OLDPWD设置为上一个目录,并cd -转换为cd "$OLDPWD"
格伦·杰克曼(Glenn Jackman)'16

@glennjackman,谢谢。这是否意味着在bash cd中与w / push / popd无关?
Dragonxlwang

我刚刚检查了一下,pushd还设定了OLDPWD
glenn jackman

返回的目录堆栈dirs始终将PWD作为第一个元素
glenn jackman

是的,但是如果cd不接触由bash中的push / popd管理的目录栈,这也很有意义。
Dragonxlwang

Answers:


17

这取决于。在中,zsh您可以配置cd为自动将旧目录推送到目录堆栈中,但这不是默认设置。

据我所知zsh,默认设置的行为非常类似于bash

  • cd somedir
    • 将目录更改为 somedir
    • 将原始目录保存在 OLDPWD
    • PWD="somedir"
    • 将目录栈的顶部元素替换为(如所示dirssomedir(栈上的元素数量不变)。
  • 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内置参数提供了一样。[…]

    打印DIRSTACKecho ${dirstack[@]})确认第一个元素与相同$PWD

  • zsh当前工作目录中,它不是目录堆栈的一部分(但仍显示为dirs)。man 1 zshbuiltins说:

    pushd [ -qsLP ] [ arg ]

    […]更改当前目录,然后将旧的当前目录推送到目录堆栈中。在第一种形式中,将当前目录更改为arg。[…]

    打印dirstackecho ${dirstack[@]})并将其与的输出进行比较,dirs应表明PWD不在dirstack中。

在两个shell中,dirs将当前工作目录打印为第一个元素。同样在两个Shell中,带有索引的目录堆栈元素1引用的是在last之前的当前目录pushd。这是因为in zsh中的数组通常从中编号1,而从0in 中编号bash。所以实际差异不大


如上所述,可以在中修改此行为zsh

如果您AUTO_PUSHDzshsetopt 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
Xerus

@Xerus它允许返回先前访问的目录,popd而无需键入(甚至不知道)路径。
Adaephon '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.