使用“-n”选项的 popd 和 pushd 行为

使用“-n”选项的 popd 和 pushd 行为

我一直在尝试使用pushdbash popd(Cygwin,手册页上写着“GNU bash 4.1”),但手册页似乎与行为不太相符。

对于pushd,命令

% pushd +1

既旋转堆栈,又改变工作目录;

% pushd -n +1

只是旋转堆栈。这似乎与手册页相符。

% popd +1 

从堆栈中删除一个条目,但不会更改工作目录(即使未提供“-n”)。这似乎与下面引用的手册页不符:

如果提供了参数,则具有以下含义:
    -n   从堆栈中删除目录时抑制目录的正常更改,以便只操作堆栈。
    +n   移除n从列表左侧开始计数的第 1 个条目dirs,从零开始。例如:“ popd +0”删除第一个目录,“ popd +1”删除第二个目录。

这是应该的样子吗?

答案1

我现在尝试使用 popd/pushd,我认为这是它应该有的样子。逻辑是-n抑制目录的更改如果它应该没有-n

popd +NN等于零不会改变目录。它只会从堆栈中删除元素。因此在这种情况下-n无需执行任何操作,因为它没有要抑制的更改。

相反,如果使用popd -npopd -n +0,则会删除堆栈顶部的第二个元素,而不是最顶部的元素。因为如果删除顶部元素,目录就会发生变化。我的意思是,如果您有:

 0  ~/one/two/three
 1  ~/one/two
 2  ~/one
 3  ~

当你做popd +0popd不做的时候-n

您的当前目录已更改为 ~/one/two,并且目录堆栈现在为:

 1  ~/one/two
 2  ~/one
 3  ~

所以-n应该抑制这种行为。因此,如果反而您运行popd -n +0或者popd -n仍然在旧目录中,并且目录堆栈现在是:

 0  ~/one/two/three
 1  ~/one
 2  ~

您可以看到第二个顶部元素 ~/one/two 被删除了,而不是最顶部(这样您就可以留在旧目录中)。

因此,我在这里要强调的是,目录堆栈的顶部始终是当前目录。并且-n应该阻止目录的更改。因此-n应该阻止堆栈顶部的更改。但如果堆栈顶部没有改变,则标志-n与原样无关。

相关内容