![使用“-n”选项的 popd 和 pushd 行为](https://linux22.com/image/1415874/%E4%BD%BF%E7%94%A8%E2%80%9C-n%E2%80%9D%E9%80%89%E9%A1%B9%E7%9A%84%20popd%20%E5%92%8C%20pushd%20%E8%A1%8C%E4%B8%BA.png)
我一直在尝试使用pushd
bash 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 +N
不N
等于零不会改变目录。它只会从堆栈中删除元素。因此在这种情况下-n
无需执行任何操作,因为它没有要抑制的更改。
相反,如果使用popd -n
或popd -n +0
,则会删除堆栈顶部的第二个元素,而不是最顶部的元素。因为如果删除顶部元素,目录就会发生变化。我的意思是,如果您有:
0 ~/one/two/three
1 ~/one/two
2 ~/one
3 ~
当你做popd +0
或popd
不做的时候-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
与原样无关。