其實,很早就知道pushd和popd在linux中可以用來方便地在多個目錄之間切換彬檀。那時比較浮躁瞬女,感覺切換目錄沒必要這么復(fù)雜诽偷。在實際中,發(fā)現(xiàn)通過使用pushd和popd能夠極大地提高效率报慕。
0眠冈、使用cd -
進(jìn)行目錄切換
一般,Shell中都可以通過cd -
命令回到之前的目錄布卡,下面是一個例子:
$ pwd
/home/lfqy
$ cd /
$ cd -
/home/lfqy
$
實際上雇盖,cd -
中崔挖,-
就相當(dāng)于變量$OLDPWD。cd -
就相當(dāng)于cd $OLDPWD
匾浪。下面是一個例子:
$ pwd
/home/lfqy
$ cd /
$ echo $OLDPWD
/home/lfqy
$ cd $OLDPWD
$ pwd
/home/lfqy
$
1卷哩、pushd属拾、popd和dirs
pushd和popd是對一個目錄棧進(jìn)行操作将谊,而dirs是顯示目錄棧的內(nèi)容。而目錄棧就是一個保存目錄的棧結(jié)構(gòu)渐白,該棧結(jié)構(gòu)的頂端永遠(yuǎn)都存放著當(dāng)前目錄(這里點從下面可以進(jìn)一步看到)尊浓。
1.1 dirs
dirs常用的有兩個參數(shù):
選項 | 含義 |
---|---|
-p | 每行顯示一條記錄 |
-v | 每行顯示一條記錄,同時展示該記錄在棧中的index |
-c | 清空目錄棧 |
下面沒有顯示地對目錄棧進(jìn)行任何操作纯衍,我們來看下當(dāng)前目錄棧的內(nèi)容是什么:
$ pwd
/home/lfqy
$ dirs -v
0 ~
$ cd /
$ dirs -v
0 /
$ dirs -c
$ dirs -v
0 /
$
可以看出栋齿,目錄棧中只有一個目錄(當(dāng)然是在棧頂),就是當(dāng)前所在的目錄。當(dāng)切換目錄之后瓦堵,棧中的目錄也隨之改變基协。通過-c
選項可以將目錄棧中除當(dāng)前目錄之外的其它目錄清除,由于上面的例子中目錄棧只包含當(dāng)前目錄澜驮,所以沒有變化。
1.2 pushd
每次pushd命令執(zhí)行完成之后惋鸥,默認(rèn)都會執(zhí)行一個dirs命令來顯示目錄棧的內(nèi)容杂穷。pushd的用法主要有如下幾種:
-
pushd 目錄
pushd后面如果直接跟目錄使用,會切換到該目錄并且將該目錄置于目錄棧的棧頂卦绣。(時時刻刻都要記住耐量,目錄棧的棧頂永遠(yuǎn)存放的是當(dāng)前目錄。如果當(dāng)前目錄發(fā)生變化滤港,那么目錄棧的棧頂元素肯定也變了拴鸵;反過來,如果棧頂元素發(fā)生變化蜗搔,那么當(dāng)前目錄肯定也變了劲藐。)下面是一個例子:
$ pwd /home/lfqy $ pushd / / ~ $ dirs -v 0 / 1 ~ $ pushd ~/Music/ ~/Music / ~ $ dirs -v 0 ~/Music 1 / 2 ~ $
這樣,不難看出樟凄,用pushd在切換目錄的同時聘芜,也將歷史目錄以棧結(jié)構(gòu)的形式保存了下來。
-
pushd不帶任何參數(shù)缝龄。
pushd不帶任何參數(shù)執(zhí)行的效果就是汰现,將目錄棧最頂層的兩個目錄進(jìn)行交換。前面說過叔壤,棧頂目錄和當(dāng)前目錄一個發(fā)生變化瞎饲,另一個也變。這樣炼绘,實際上嗅战,就實現(xiàn)了
cd -
的功能。下面是一個例子(這個例子接上文的執(zhí)行現(xiàn)場):$ 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)脚曾,并將該目錄以棧循環(huán)的方式推到棧頂东且。下面是一個例子(接上文的執(zhí)行現(xiàn)場),注意棧循環(huán)的方式帶來的棧中內(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)都會執(zhí)行一個dirs命令來顯示目錄棧的內(nèi)容珊泳。popd的用法主要有如下幾種:
-
popd不帶參數(shù)
popd不帶任何參數(shù)執(zhí)行的效果鲁冯,就是將目錄棧中的棧頂元素出棧。這時色查,棧頂元素發(fā)生變化晓褪,自然當(dāng)前目錄也會發(fā)生相應(yīng)的切換(接上文的執(zhí)行現(xiàn)場),下面是一個例子:
$ 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 / $
這里可以發(fā)現(xiàn)涣仿,如果對于目錄棧的操作沒有引發(fā)棧頂元素的變化,將不會導(dǎo)致當(dāng)前目錄的切換示惊。
2好港、pushd和popd的+n和-n
上面我們用的都是+n作為參數(shù),實際在使用pushd和popd的時候米罚,有時候也會用到-n參數(shù)钧汹。兩者的差別如下:+n的含義是從棧頂往棧底方向進(jìn)行計數(shù),從0開始录择;-n的含義剛好相反拔莱,從棧底向棧頂方向計數(shù),從0開始隘竭。這樣有點拗口塘秦,實際上,從默認(rèn)的dirs命令(不帶任何參數(shù))的輸出來解釋最好理解了:+n是指從左往右數(shù)动看,-n是指從右往左數(shù)尊剔,都是從0開始。