操纵目录栈

刚才我还特地请教了下我们宿舍打ACM的杰神,讲了一下堆、栈、队列之间的差别和联系,然后,这一小节的题目还算不错,栈,先进后出。

  • dirs 显示当前目录栈的内容
  • pushd 入目录栈
  • popd 出目录栈

那么这三个命令都有什么用处呢?

不罗嗦,看操作:

  1. for i in {1..4};do mkdir dir_$i;done
  2. mkdir: created directory dir_1
  3. mkdir: created directory dir_2
  4. mkdir: created directory dir_3
  5. mkdir: created directory dir_4
  6. cd dir_1
  7. pushd . #pushd完成之后总会进入这一个目录
  8. /tmp/dir_1 /tmp/dir_1
  9. cd /tmp/dir_2
  10. pushd . #而且还会显示当前的目录栈内容
  11. /tmp/dir_2 /tmp/dir_2 /tmp/dir_1
  12. cd /tmp/dir_3
  13. pushd .
  14. /tmp/dir_3 /tmp/dir_3 /tmp/dir_2 /tmp/dir_1
  15. cd /tmp/dir_4
  16. pushd .
  17. /tmp/dir_4 /tmp/dir_4 /tmp/dir_3 /tmp/dir_2 /tmp/dir_1
  18. dirs #第一个是dir_4,因为栈的顶总是当前目录
  19. /tmp/dir_4 /tmp/dir_4 /tmp/dir_3 /tmp/dir_2 /tmp/dir_1

那么到现在为止我们的目录栈看起来是这样的:

  1. 1 - /tmp/dir_1
  2. 2 - /tmp/dir_2
  3. 3 - /tmp/dir_3
  4. 4 - /tmp/dir_4

接下来就轮到popd啦:

  1. pwd
  2. /tmp/dir_4
  3. dirs #dirs显示目录栈内容
  4. /tmp/dir_4 /tmp/dir_4 /tmp/dir_3 /tmp/dir_2 /tmp/dir_1
  5. popd #每次目录出栈之后都会显示目录栈的内容
  6. /tmp/dir_4 /tmp/dir_3 /tmp/dir_2 /tmp/dir_1
  7. pwd #并且进入那个目录
  8. /tmp/dir_4
  9. popd
  10. /tmp/dir_3 /tmp/dir_2 /tmp/dir_1
  11. pwd
  12. /tmp/dir_3
  13. popd
  14. /tmp/dir_2 /tmp/dir_1
  15. pwd
  16. /tmp/dir_2
  17. popd
  18. /tmp/dir_1
  19. pwd
  20. /tmp/dir_1
  21. popd #栈空了,没有了
  22. bash: popd: directory stack empty

看了这么多,这些组合到底有什么用?其实吧,如果你手速够快记忆力够好的话,这些对你没啥用,不过呢,像我这样比较懒的人,这东西就有用了,比如,我要在几个目录之间切换,有不想每次都输入那些命令,怎么办?就用这种方法,因为pushd不仅进入了这个目录,而且还给了我一个后退的途径,比cd -更高级一点。甚至我可以用function cd() { pushd $@ &> /dev/null; }来将pushd变成cd,反正我也不亏,是不是 :P