Pushd和popd是你从未听说过的最快的导航命令。
原文地址:opensource.com/article/19/…
原文作者:opensource.com/users/seth
发布时间:2019年08月07日
图片由:Opensource.com
pushd和popd命令是Bash shell的内置功能,可以帮助你 "书签 "目录,以便在硬盘驱动器上的位置之间快速导航。你可能已经感觉到终端是一种不可能快速浏览电脑的方式;只需按几个键,你就可以去硬盘、附加存储或网络共享的任何地方。但是,当你发现自己在目录之间来回走动,或者在文件系统中 "迷路 "时,这种速度就会被打破。这些正是pushd和popd可以帮你解决的问题。
pushd
最基本的,pushd和cd很像。它把你从一个目录带到另一个目录。假设你有一个叫1的目录,其中包含一个叫2的子目录,其中包含一个叫3的子目录,以此类推。如果你当前的工作目录是 one,那么你可以用 cd 命令移动到 two、three 或任何地方。
$ pwd
one
$ cd two/three
$ pwd
three
你也可以用pushd来做。
$ pwd
one
$ pushd two/three
~/one/two/three ~/one
$ pwd
three
pushd 的最终结果和 cd 是一样的,但有一个额外的中间结果:pushd 会回溯你的目标目录和你的原点。这就是你的目录堆栈,也是 pushd 的独特之处。
堆栈
栈,在计算机术语中,指的是元素的集合。在这个命令的上下文中,这些元素是你最近使用pushd命令访问过的目录。你可以把它看作是一个历史记录或面包屑线索。
你可以用 pushd 命令在整个文件系统中移动;每次移动,你之前和新的位置都会被添加到堆栈中。
$ pushd four
~/one/two/three/four ~/one/two/three ~/one
$ pushd five
~/one/two/three/four/five ~/one/two/three/four ~/one/two/three ~/one
栈的导航
一旦你建立了一个堆栈,你就可以把它作为一个书签或快速旅行的航点的集合。例如,假设在一个会话中,你在本例的 ~/one/two/three/four/five 目录结构中做了很多工作。你知道你最近去过一个,但你记不起它在你的pushd栈中的位置。你可以用+0(就是一个加号,后面跟着一个零)参数来查看你的堆栈,它告诉pushd不要改到你的堆栈中的任何目录,同时也提示pushd呼应你当前的堆栈。
$ pushd +0
~/one/two/three/four ~/one/two/three ~/one ~/one/two/three/four/five
另外,你也可以用dirs命令查看堆栈,通过使用-v选项可以看到每个目录的索引号。
$ dirs -v
0 ~/one/two/three/four
1 ~/one/two/three
2 ~/one
3 ~/one/two/three/four/five
栈中的第一个条目是你的当前位置。你可以像往常一样用 pwd 确认。
$ pwd
~/one/two/three/four
从0开始(你的当前位置和堆栈的第一个条目),堆栈中的第二个元素是~/one,这是你想要的目的地。你可以使用+2选项在你的堆栈中向前移动。
$ pushd +2
~/one ~/one/two/three/four/five ~/one/two/three/four ~/one/two/three
$ pwd
~/one
这将你的工作目录改为 ~/one,并且移动了堆栈,使你的新位置在前面。
你也可以在你的堆栈中向后移动。例如,为了快速到达 ~/one/two/three,在给定的示例输出中,你可以向后移动一个,记住 pushd 是以 0 开始的。
$ pushd -0
~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four
加到堆栈中
你可以继续以这种方式浏览你的堆栈,它将保持你最近访问的目录的静态列表。如果你想添加一个目录,只需提供该目录的路径。如果一个目录是堆栈中的新目录,它就会像你期望的那样被添加到列表中。
$ pushd /tmp
/tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four
但如果它已经存在于堆栈中,就会再添加一次。
$ pushd ~/one
~/one /tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/
虽然堆栈经常被用作你想要快速访问的目录列表,但它实际上是你去过的真实历史。如果你不希望一个目录被多余地添加到堆栈中,你必须使用+N和-N符号。
从堆栈中删除目录
很明显,你的堆栈不是不可改变的。你可以用pushd添加到堆栈中,或者用popd从堆栈中移除项目。
例如,假设你刚刚用pushd将~/one添加到你的堆栈中,使~/one成为你当前的工作目录。要删除第一个元素(或者 "zeroeth",如果你喜欢的话)。
$ pwd
~/one
$ popd +0
/tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four
$ pwd
~/one
当然,你可以删除任何元素,从0开始计数。
$ pwd ~/one
$ popd +2
/tmp ~/one/two/three ~/one/two/three/four/five ~/one/two/three/four
$ pwd ~/one
你也可以使用popd从你的堆栈后面开始,同样以0开始。例如,要从你的堆栈中删除最后一个目录。
$ popd -0
/tmp ~/one/two/three ~/one/two/three/four/five
当这样使用时,popd不会改变你的工作目录。它只对你的堆栈进行操作。
用popd导航
popd的默认行为是,在没有参数的情况下,从堆栈中删除第一个(零点)项目,并将下一个项目作为当前工作目录。
当你在两个不同的目录下工作时,比如说,你只需要暂时躲到其他位置,这是最有用的快速改变命令。如果你不需要详细的历史记录,你就不必考虑你的目录堆栈。
$ pwd
~/one
$ pushd ~/one/two/three/four/five
$ popd
$ pwd
~/one
你也不需要快速连续使用pushd和popd。如果你使用pushd访问不同的位置,然后分心三个小时追寻一个bug或做研究,你会发现你的目录堆栈在耐心地等待(除非你已经结束了终端会话)。
$ pwd ~/one
$ pushd /tmp
$ cd {/etc,/var,/usr}; sleep 2001
[...]
$ popd
$ pwd
~/one
现实世界中的PUSHD和POPD
pushd和popd命令出奇的有用。一旦你学会了它们,你就会找到借口把它们用好,你也会熟悉目录栈的概念。熟悉pushd是帮助我理解git stash的原因,它与pushd完全无关,但在概念上却有相似的无形性。
在shell脚本中使用pushd和popd可能很诱人,但一般来说,最好还是避免使用它们。它们在Bash和Zsh之外是不可移植的,而且当你重新阅读一个脚本的时候,它们可能会变得晦涩难懂(pushd +3比cd DIR/$TMP或类似的命令更不清楚)。
除了这些警告之外,如果你是一个普通的Bash或Zsh用户,那么你可以而且应该尝试使用pushd和popd。