Linux中的pushd和popd

其實(shí),很早就知道pushd和popd在linux中可以用來(lái)方便地在多個(gè)目錄之間切換。那時(shí)比較浮躁,感覺(jué)切換目錄沒(méi)必要這么復(fù)雜。在實(shí)際中,發(fā)現(xiàn)通過(guò)使用pushd和popd能夠極大地提高效率。

0、使用cd -進(jìn)行目錄切換

一般,Shell中都可以通過(guò)cd -命令回到之前的目錄,下面是一個(gè)例子:

$ pwd
/home/lfqy
$ cd /
$ cd -
/home/lfqy
$ 

實(shí)際上,cd -中,-就相當(dāng)于變量$OLDPWD。cd -就相當(dāng)于cd $OLDPWD。下面是一個(gè)例子:

$ pwd
/home/lfqy
$ cd /
$ echo $OLDPWD
/home/lfqy
$ cd $OLDPWD
$ pwd
/home/lfqy
$ 

1、pushd、popd和dirs

pushd和popd是對(duì)一個(gè)目錄棧進(jìn)行操作,而dirs是顯示目錄棧的內(nèi)容。而目錄棧就是一個(gè)保存目錄的棧結(jié)構(gòu),該棧結(jié)構(gòu)的頂端永遠(yuǎn)都存放著當(dāng)前目錄(這里點(diǎn)從下面可以進(jìn)一步看到)。

1.1 dirs

dirs常用的有兩個(gè)參數(shù):

選項(xiàng) 含義
-p 每行顯示一條記錄
-v 每行顯示一條記錄,同時(shí)展示該記錄在棧中的index
-c 清空目錄棧

下面沒(méi)有顯示地對(duì)目錄棧進(jìn)行任何操作,我們來(lái)看下當(dāng)前目錄棧的內(nèi)容是什么:

$ pwd
/home/lfqy
$ dirs -v
 0  ~
$ cd /
$ dirs -v
 0  /
$ dirs -c
$ dirs -v
 0  /
$ 

可以看出,目錄棧中只有一個(gè)目錄(當(dāng)然是在棧頂),就是當(dāng)前所在的目錄。當(dāng)切換目錄之后,棧中的目錄也隨之改變。通過(guò)-c選項(xiàng)可以將目錄棧中除當(dāng)前目錄之外的其它目錄清除,由于上面的例子中目錄棧只包含當(dāng)前目錄,所以沒(méi)有變化。

1.2 pushd

每次pushd命令執(zhí)行完成之后,默認(rèn)都會(huì)執(zhí)行一個(gè)dirs命令來(lái)顯示目錄棧的內(nèi)容。pushd的用法主要有如下幾種:

  1. pushd 目錄

    pushd后面如果直接跟目錄使用,會(huì)切換到該目錄并且將該目錄置于目錄棧的棧頂。(時(shí)時(shí)刻刻都要記住,目錄棧的棧頂永遠(yuǎn)存放的是當(dāng)前目錄。如果當(dāng)前目錄發(fā)生變化,那么目錄棧的棧頂元素肯定也變了;反過(guò)來(lái),如果棧頂元素發(fā)生變化,那么當(dāng)前目錄肯定也變了。)下面是一個(gè)例子:

     $ pwd
     /home/lfqy
     $ pushd /
     / ~
     $ dirs -v
      0  /
      1  ~
     $ pushd ~/Music/
     ~/Music / ~
     $ dirs -v
      0  ~/Music
      1  /
      2  ~
     $
    

    這樣,不難看出,用pushd在切換目錄的同時(shí),也將歷史目錄以棧結(jié)構(gòu)的形式保存了下來(lái)。

  2. pushd不帶任何參數(shù)。

    pushd不帶任何參數(shù)執(zhí)行的效果就是,將目錄棧最頂層的兩個(gè)目錄進(jìn)行交換。前面說(shuō)過(guò),棧頂目錄和當(dāng)前目錄一個(gè)發(fā)生變化,另一個(gè)也變。這樣,實(shí)際上,就實(shí)現(xiàn)了cd -的功能。下面是一個(gè)例子(這個(gè)例子接上文的執(zhí)行現(xiàn)場(chǎng)):

     $ dirs -v
      0  ~/Music
      1  /
      2  ~
     $ pushd
     / ~/Music ~
     $ dirs -v
      0  /
      1  ~/Music
      2  ~
     $ pushd
     ~/Music / ~
     $ dirs -v
      0  ~/Music
      1  /
      2  ~
     $ 
    
  3. pushd +n

    到這里,可能會(huì)想如果想切換到目錄棧中的任意一個(gè)目錄,該如何?pushd +n正是這個(gè)作用:pushd +n切換到目錄棧中的第n個(gè)目錄(這里的n就是dirs -v命令展示的index),并將該目錄以棧循環(huán)的方式推到棧頂。下面是一個(gè)例子(接上文的執(zhí)行現(xiàn)場(chǎng)),注意棧循環(huán)的方式帶來(lái)的棧中內(nèi)容的變化規(guī)律:

     $ 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命令執(zhí)行完成之后,默認(rèn)都會(huì)執(zhí)行一個(gè)dirs命令來(lái)顯示目錄棧的內(nèi)容。popd的用法主要有如下幾種:

  1. popd不帶參數(shù)

    popd不帶任何參數(shù)執(zhí)行的效果,就是將目錄棧中的棧頂元素出棧。這時(shí),棧頂元素發(fā)生變化,自然當(dāng)前目錄也會(huì)發(fā)生相應(yīng)的切換(接上文的執(zhí)行現(xiàn)場(chǎng)),下面是一個(gè)例子:

     $ dirs -v
      0  ~/Music
      1  /
      2  ~
     $ popd
     / ~
     $ dirs -v
      0  /
      1  ~
     $ popd
     ~
     $ dirs -v
      0  ~
     $ 
    
  2. popd +n

    將目錄棧中的第n個(gè)元素刪除(這里的n就是命令dirs -v顯示的目錄index)。下面是一個(gè)例子:

     $ dirs -v
      0  ~/Music
      1  /
      2  ~
     $ popd +2
     ~/Music /
     $
    

    這里可以發(fā)現(xiàn),如果對(duì)于目錄棧的操作沒(méi)有引發(fā)棧頂元素的變化,將不會(huì)導(dǎo)致當(dāng)前目錄的切換。

2、pushd和popd的+n和-n

上面我們用的都是+n作為參數(shù),實(shí)際在使用pushd和popd的時(shí)候,有時(shí)候也會(huì)用到-n參數(shù)。兩者的差別如下:+n的含義是從棧頂往棧底方向進(jìn)行計(jì)數(shù),從0開(kāi)始;-n的含義剛好相反,從棧底向棧頂方向計(jì)數(shù),從0開(kāi)始。這樣有點(diǎn)拗口,實(shí)際上,從默認(rèn)的dirs命令(不帶任何參數(shù))的輸出來(lái)解釋最好理解了:+n是指從左往右數(shù),-n是指從右往左數(shù),都是從0開(kāi)始。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評(píng)論 25 708
  • 誰(shuí)知,深秋夜寒, 萬(wàn)家燈火星點(diǎn)點(diǎn), 殘燭燈花剪。 誰(shuí)知,暗香悠然, 笙簫驟停一聲嘆, 樹(shù)影葉斑斕! 誰(shuí)知,思緒還亂...
    秋爽齋閱讀 436評(píng)論 0 0
  • 帥氣的阿桃閱讀 351評(píng)論 0 1
  • 敦刻爾克不像電影倒像紀(jì)錄片,比起紀(jì)錄片又更有臨場(chǎng)感,抬擔(dān)架趕船時(shí)的空襲讓人緊張,被困在船底時(shí)的窒息讓人緊張,躲開(kāi)德...
    睡務(wù)總局局長(zhǎng)閱讀 307評(píng)論 0 0

友情鏈接更多精彩內(nèi)容