其實,很早就知道pushd和popd在linux中可以用來方便地在多個目錄之間切換。那時比較浮躁,感覺切換目錄沒必要這么復雜。在實際中,發現通過使用pushd和popd能夠極大地提高效率。
0、使用cd -進行目錄切換
一般,Shell中都可以通過cd -命令回到之前的目錄,下面是一個例子:
$ pwd /home/lfqy $ cd / $ cd - /home/lfqy $
實際上,cd -中,-就相當於變量$OLDPWD。cd -就相當於cd $OLDPWD。下面是一個例子:
$ pwd /home/lfqy $ cd / $ echo $OLDPWD /home/lfqy $ cd $OLDPWD $ pwd /home/lfqy $
1、pushd、popd和dirs
pushd和popd是對一個目錄棧進行操作,而dirs是顯示目錄棧的內容。而目錄棧就是一個保存目錄的棧結構,該棧結構的頂端永遠都存放着當前目錄(這里點從下面可以進一步看到)。
1.1 dirs
dirs常用的有兩個參數:
選項
|
含義
|
-p
|
每行顯示一條記錄
|
-v
|
每行顯示一條記錄,同時展示該記錄在棧中的index
|
-c
|
清空目錄棧
|
下面沒有顯示地對目錄棧進行任何操作,我們來看下當前目錄棧的內容是什么:
$ pwd /home/lfqy $ dirs -v 0 ~ $ cd / $ dirs -v 0 / $ dirs -c $ dirs -v 0 / $
可以看出,目錄棧中只有一個目錄(當然是在棧頂),就是當前所在的目錄。當切換目錄之后,棧中的目錄也隨之改變。通過-c選項可以將目錄棧中除當前目錄之外的其它目錄清除,由於上面的例子中目錄棧只包含當前目錄,所以沒有變化。
1.2 pushd
每次pushd命令執行完成之后,默認都會執行一個dirs命令來顯示目錄棧的內容。pushd的用法主要有如下幾種:
pushd 目錄
pushd后面如果直接跟目錄使用,會切換到該目錄並且將該目錄置於目錄棧的棧頂。(時時刻刻都要記住,目錄棧的棧頂永遠存放的是當前目錄。如果當前目錄發生變化,那么目錄棧的棧頂元素肯定也變了;反過來,如果棧頂元素發生變化,那么當前目錄肯定也變了。)下面是一個例子:
$ pwd /home/lfqy $ pushd / / ~ $ dirs -v 0 / 1 ~ $ pushd ~/Music/ ~/Music / ~ $ dirs -v 0 ~/Music 1 / 2 ~ $
這樣,不難看出,用pushd在切換目錄的同時,也將歷史目錄以棧結構的形式保存了下來。
pushd不帶任何參數。
pushd不帶任何參數執行的效果就是,將目錄棧最頂層的兩個目錄進行交換。前面說過,棧頂目錄和當前目錄一個發生變化,另一個也變。這樣,實際上,就實現了cd -的功能。下面是一個例子(這個例子接上文的執行現場):
$ dirs -v 0 ~/Music 1 / 2 ~ $ pushd / ~/Music ~ $ dirs -v 0 / 1 ~/Music 2 ~ $ pushd ~/Music / ~ $ dirs -v 0 ~/Music 1 / 2 ~ $
pushd +n
到這里,可能會想如果想切換到目錄棧中的任意一個目錄,該如何?pushd +n正是這個作用:pushd +n切換到目錄棧中的第n個目錄(這里的n就是dirs -v命令展示的index),並將該目錄以棧循環的方式推到棧頂。下面是一個例子(接上文的執行現場),注意棧循環的方式帶來的棧中內容的變化規律:
$ dirs -v 0 ~/Music 1 / 2 ~ $ pushd +2 ~ ~/Music / $ dirs -v 0 ~ 1 ~/Music 2 / $ pushd +1 ~/Music / ~ $ dirs -v 0 ~/Music 1 / 2 ~ $
1.3 popd
每次popd命令執行完成之后,默認都會執行一個dirs命令來顯示目錄棧的內容。popd的用法主要有如下幾種:
popd不帶參數
popd不帶任何參數執行的效果,就是將目錄棧中的棧頂元素出棧。這時,棧頂元素發生變化,自然當前目錄也會發生相應的切換(接上文的執行現場),下面是一個例子:
$ dirs -v 0 ~/Music 1 / 2 ~ $ popd / ~ $ dirs -v 0 / 1 ~ $ popd ~ $ dirs -v 0 ~ $
popd +n
將目錄棧中的第n個元素刪除(這里的n就是命令dirs -v顯示的目錄index)。下面是一個例子:
$ dirs -v 0 ~/Music 1 / 2 ~ $ popd +2 ~/Music / $
這里可以發現,如果對於目錄棧的操作沒有引發棧頂元素的變化,將不會導致當前目錄的切換。
2、pushd和popd的+n和-n
上面我們用的都是+n作為參數,實際在使用pushd和popd的時候,有時候也會用到-n參數。兩者的差別如下:+n的含義是從棧頂往棧底方向進行計數,從0開始;-n的含義剛好相反,從棧底向棧頂方向計數,從0開始。這樣有點拗口,實際上,從默認的dirs命令(不帶任何參數)的輸出來解釋最好理解了:+n是指從左往右數,-n是指從右往左數,都是從0開始。
作者:SpaceCat
鏈接:http://www.jianshu.com/p/53cccae3c443
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。