命令cd可用来改变工作目录,但它只能“记住”上一次的目录(运行命令cd-或者cd$OLDPWD可以回到上一次的目录)。使用目录栈可以让更多的目录被“记住”。内置命令pushd用来将目录添加到目录栈,运行命令pushd之前,当前目录默认已经在栈里面。每添加一个目录后,当前路径默认变为刚刚添加的目录。因为pushd与popd命令默认会使当前路径发生变化,为了便于看清当前路径是如何随着pushd与popd命令的运行而变化的,所以下面的例子中的命令行提示符不再是一个单独的美元符$,$前面是当前的路径。
例如,一开始,当前路径为主目录~,添加/usr/bin后,目录栈为/usr/bin~:
再增加两个目录至目录栈,注意当前路径的变化:
内置命令dirs用来显示目录栈。使用选项-c时,目录栈将被清空(clear)。使用选项-p时,每行只显示一个目录。使用选项-v时,每行只显示一个有编号的目录,编号从0开始,编号小的在栈顶,编号大的在栈底。接着前面的例子:
内置变量DIRSTACK(见表4-3)记录了目录栈,它实际上是个数组,用declare-p命令可以查看它:
内置命令popd用来从目录栈中移除目录,默认从栈顶开始、每次移除一个目录。移除栈顶目录后,刚刚还处在第二位的目录变为栈顶,当前目录就变为新的处在栈顶的目录。接着前面的例子:
当栈里面只剩下一个目录时,再继续运行popd命令时,会显示错误提示:
命令pushd和popd运行时,当前路径默认会发生改变。这两条命令都有选项-n,使用该选项时,在添加或移除目录时,当前路径不改变。
本节讲的三条命令都可以带参数+N和-N,N为非负整数,从0开始取值。
命令dirs±N不改变目录栈的内容。dirs +N的作用是:显示从栈顶(或者说从左边)开始数的第N个目录;dirs-N的作用是:显示从栈底(或者说从右边)开始数的第N个目录。
例如,目录栈有4个目录:
命令popd默认只从栈顶移除目录,而popd ±N可以有选择地移除目录。popd +N的作用是:移除从栈顶(左边)开始数的第N个目录;popd -N的作用是:移除从栈底(右边)开始数的第N个目录。(www.xing528.com)
接着前面的例子,先显示目录栈,然后移除从栈顶开始(从0开始数)的第1个目录:
移除栈底目录:
查看一下目录栈:
命令pushd ±N并不向栈内添加目录,而是调整栈内的目录次序。把目录栈想象为栈顶与栈底首尾相接的“环”,pushd +N的作用是:从栈顶(左边)开始的第N个目录变为栈顶;popd -N的作用是:从栈底(右边)开始的第N个目录变为栈顶;刚刚还处在新的栈顶目录之上的(左边的)目录沿着“环”滑到栈尾重新“排队”,栈内目录次序的调整结束。命令pushd ±N的输出结果为“滑动”后的目录栈。下面举例说明。先显示目录栈:
栈顶目录本来就在栈顶,pushd+0不使栈发生变化:
从0开始数,将第1个目录/opt变为栈顶,原栈顶/etc“滑动”到栈底:
现在目录栈为/opt/sbin/tmp/etc,将栈底目录/etc“提拔”为栈顶:
现在目录栈为/etc/opt/sbin/tmp,将栈底上面的第1个目录/sbin变为栈顶:
现在目录栈为/sbin/tmp/etc/opt,将栈顶下面的第2个目录/etc变为栈顶:
利用pushd与popd,可以从当前目录切换到另外一个目录,执行某条命令后,再返回当前目录,格式为:pushd dir1 && command1 && popd(其实这条命令可以由cd dir1 && command1 && cd -来代替)。又如,要分别在两个目录下执行命令再返回到当前目录,命令格式为:pushd dir1 && command1 && pushd dir2 && command2 && popd && popd。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。