在這個系列的第一部分,我們詳細地討論了 cd -
命令,在第二部分,我們深入探究了 pushd
和 popd
兩個命令,以及它們使用的場景。
繼續對命令列的討論,在這篇教程中,我們將會通過簡單易懂的例項來討論 CDPATH
這個環境變數。我們也會討論關於此變數的一些進階細節。
在這之前,先宣告一下此教程中的所有例項都已經在 Ubuntu 14.04 和 4.3.11(1) 版本的 Bash 下測試過。
環境變數 CDPATH
即使你的命令列所有操作都在特定的目錄下 – 例如你的主目錄,然而在你切換目錄時也不得不提供絕對路徑。比如,考慮我現在的情況,就是在 /home/himanshu/Downloads
目錄下:
1 2 3 |
$ pwd /home/himanshu/Downloads |
現在要求切換至 /home/himanshu/Desktop
目錄,我一般會這樣做:
1 2 |
cd /home/himanshu/Desktop/ |
或者
1 2 |
cd ~/Desktop/ |
或者
1 2 |
cd ../Desktop/ |
能不能只是執行以下命令就能簡單地實現呢:
1 2 |
cd Desktop |
是的,這完全有可能。這就是環境變數 CDPATH
出現的時候了。你可使用這個變數來為 cd
命令定義基礎目錄。
如果你嘗試列印它的值,你會看見這個環境變數預設是空值的:
1 2 |
$ echo $CDPATH |
現在 ,考慮到上面提到的場景,我們使用這個環境變數,將 /home/himanshu
作為 cd
命令的基礎目錄來使用。
最簡單的做法這樣:
1 2 |
export CDPATH=/home/himanshu |
現在,我能做到之前所不能做到的事了 – 當前工作目錄在 /home/himanshu/Downloads
目錄裡時,成功地執行了 cd Desktop
命令。
1 2 3 4 5 6 |
$ pwd /home/himanshu/Downloads $ cd Desktop/ /home/himanshu/Desktop $ |
這表明了我可以使用 cd
命令來到達 /home/himanshu
下的任意一個目錄,而不需要在 cd
命令中顯式地指定 /home/himanshu
或者 ~
,又或者是 ../
(或者多個 ../
)。
要點
現在你應該知道了怎樣利用環境變數 CDPATH
在 /home/himanshu/Downloads
和 /home/himanshu/Desktop
之間輕鬆切換。現在,考慮以下這種情況, 在 /home/himanshu/Desktop
目錄裡包含一個名字叫做 Downloads
的子目錄,這是將要切換到的目錄。
但突然你會意識到 cd Downloads
會切換到 /home/himanshu/Downloads
。所以,為了確保這不會發生,你可以這樣做:
1 2 |
cd ./Downloads |
雖然上述命令本身沒有問題,但你還是需要耗費點額外的精力(雖然很小),尤其是每次這種情況發生時你都不得不這樣做。所以,有一個更加優雅的解決方案來處理,就是以如下方式來設定 CDPATH
環境變數。
1 2 |
export CDPATH=".:/home/himanshu" |
它的意思是告訴 cd
命令先在當前的工作目錄查詢該目錄,然後再嘗試搜尋 /home/himanshu
目錄。當然, cd
命令是否以這樣的方式執行,完全取決於你的偏好和要求 – 討論這一點的目的是為了讓你知道這種情況可能會發生。
就如你現在所知道的,一旦環境變數 CDPATH
被設定,它的值 – 或者它所包含的路徑集合 – 就是系統中 cd
命令搜尋目錄的地方 ( 當然除了使用絕對路徑的場景 )。所以,完全取決於你來確保該命令列為的一致性。
繼續說,如果一個 bash 指令碼以相對路徑使用 cd
命令,最好還是先清除或者重置環境變數 CDPATH
,除非你覺得遇上不可預測的麻煩也無所謂。還有一個可選的方法,比起在終端使用 export
命令來設定 CDPATH
,你可以在測試完當前的 shell 是互動式還是非互動式之後,再在你的 .bashrc
檔案裡設定環境變數,這樣可以確保你對環境變數的改動只對互動式 shell 生效。
環境變數中,路徑出現的順序同樣也是很重要。舉個例子,如果當前目錄是在 /home/himanshu
目錄之前列出來,cd
命令就會先搜尋當前的工作目錄然後才會搜尋 /home/himanshu
目錄。然而,如果該值為 /home/himanshu:.
,搜尋就首先從 /home/himanshu
開始,然後到當前目錄。不用說,這會影響 cd
命令的行為,並且不注意路徑的順序可能會導致一些麻煩。
要牢記在心的是,環境變數 CDPATH
,就像其名字表達的,只對 cd
命令有作用。意味著在 /home/himanshu/Downloads
目錄裡面時,你能執行 cd Desktop
命令來切換到 /home/himanshu/Desktop
目錄,但你不能使用 ls
。以下是一個例子:
1 2 3 4 5 6 |
$ pwd /home/himanshu/Downloads $ ls Desktop ls: cannot access Desktop: No such file or directory $ |
然而,這還是有簡單的變通處理的。例如,我們可以用以下不怎麼費力的方式來達到目的:
1 2 3 4 |
$ cd Desktop/;ls /home/himanshu/Desktop backup backup~ Downloads gdb.html outline~ outline.txt outline.txt~ |
不過,不是每種情況就能變通處理的。
另一個重點是:就像你可能已經觀察到的,每次你使用 CDPATH
環境變數集來執行 cd
命令時,該命令都會在輸出裡顯示你切換到的目錄的完整路徑。不用說,不是所有人都想在每次執行 cd
命令時看到這些資訊。
為了確保該輸出被制止,你可以使用以下命令:
1 2 |
alias cd='>/dev/null cd' |
如果 cd
命令執行成功,上述命令不會輸出任何東西,如果失敗,則允許產生錯誤資訊。
最後,假如你遇到設定 CDPATH
環境變數後,不能使用 shell 的 tab 自動補全功能的問題,可以嘗試安裝並啟用 bash 自動補全(bash-completion)。更多請參考 這裡。
總結
CDPATH
環境變數時一把雙刃劍,如果沒有掌握完善的知識和隨意使用,可能會令你陷入困境,並花費你大量寶貴時間去解決問題。當然,這不代表你不應該去試一下;只需要瞭解一下所有的可用選項,如果你得出結論,使用 CDPATH
會帶來很大的幫助,就繼續使用它吧。
你已經能夠熟練地使用 CDPATH
了嗎?你有更多的貼士要分享?請在評論區裡發表一下你的想法吧。
請使用手機”掃一掃”x