经常在shell下工作的筒子们经常会在不同的目录来回切换,那么,如何能提高切换的效率呢?不用每次手动输入cd /path/to/dir1; cd /path/to/dir2?
在只有两个目录的情况下,有个很简单也很直观的办法:
$ cd - #表示回到之前的目录
多说一句,这个-还有其他的一个典型用法:如果文件名参数是一个单破折号"-",表示从标准输入读取文件列表:
$ grep 'abc' - #表示接受标准输入的数据,并从中找到包含'abc'字符串的行,打印出来
abdse #我在键盘的输入
abc
abc #grep的输出
lsl
[CTRL-C] #按ctrl+c结束输入
两个目录尚且可以用上述方法快速切换,那么对于多个目录呢?pushd,dirs和popd这一组强大而易用的命令现在可以上场了.
对于CS毕业的人来说,栈是很熟悉的了,这一组命令实际上也是维护了一个目录栈.
pushd /path/to/dir,顾名思义,表示将指定目录入栈,另外,它还具有一个更强大的附加功能:像将栈内的元素顺序随意调整(似乎有些违背栈的原理了:),
正是这个功能让我们可以随心所欲的切换目录,而无视目录在栈中的位置.这种用法可以描述为pushd +num 后面我将详细介绍.
popd /path/to/dir,表示将指定的目录出栈,当我们不需要访问某个目录时,就是用这个命令将其清理出'门户'.与pushd对应,popd也有另一种形式的命令:popd +num.
dirs,显示当前栈的内容,从左向右分别是栈顶->栈底.
应用示例:
$ cd
~$ dirs #显示当前目录栈
#---------------------------------
#我们先加几个目录玩玩
#---------------------------------
~$ pushd ~/A #将指定目录入栈
~/A ~
~/A$ pushd ~/B #继续入栈, 注意此时的当前目录已经切换到刚刚入栈的目录,即:~/A
~/B ~/A ~ #当前栈的内容从左往右:栈顶->栈底
~/B$ pushd ~/C #最后一个了,大家坚持住
~/C ~/B ~/A ~
#---------------------------------
#现在我们试试切换目录
#---------------------------------
~/C$dirs #打印当前栈的内容
~/C ~/B ~/A ~
~/C$ pushd #切换到B目录,pushd 意思隐含为pushd +1
~/B ~/C ~/A #切换过去的同时会打印出切换后的栈情形.
~/B$ #注意当B到栈顶后,剩余元素位置按其之前栈内顺序排列
~/B$ pushd +2 #切换到栈顶+2个目录即A目录
~/A ~/B ~/C
~/A$
#---------------------------------
#有不用的目录,将其扔出
#---------------------------------
~/A$ popd +1 #将~/B目录出栈
~/A ~/C
~/A$ #此时目录不会切换