pushd、popd 与 cd、cd-in bash 和 zsh

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
    • 的交换价值PWDOLDPWD
    • 修改目录堆栈的顶部元素以反映(新的) 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,而它们从0in编号bash。所以几乎没有实际区别


如上所述,可以在zsh.

如果您设置AUTO_PUSHD的选项zshsetopt autopushdcd 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选项来防止重复。
有关更多选项,请查看手册

  • 可以使用例如 `pushd 目录;Pushd 子目录`。最后您将位于“./directory/subdirectory”中。一个 popd 将您带回“./directory”,另一个 popd 将您带至“.”,但是“cd 目录;” cd 子目录;光盘 -; 无论您使用多少个 cd -` 命令,cd -` 都会将您留在`./directory` 中,因为只保存了一个“OLDPWD”。 (2认同)
  • 对于那些使用 [prezto](https://github.com/sorin-ionescu/prezto) 的人来说,“directory”模块会偷偷地设置“AUTO_PUSHD”。您可以在这里注释掉:`~/.zprezto/modules/directory/init.zsh` (2认同)