閱讀326 返回首頁    go 京東網上商城


Linux 命令行工具使用小貼士及技巧(三)

在這個係列的第一部分,我們詳細地討論了 cd - 命令,在第二部分,我們深入探究了 pushd 和 popd 兩個命令,以及它們使用的場景。

繼續對命令行的討論,在這篇教程中,我們將會通過簡單易懂的實例來討論 CDPATH 這個環境變量。我們也會討論關於此變量的一些進階細節。

在這之前,先聲明一下此教程中的所有實例都已經在 Ubuntu 14.04 和 4.3.11(1) 版本的 Bash 下測試過。

環境變量 CDPATH

即使你的命令行所有操作都在特定的目錄下 - 例如你的主目錄,然而在你切換目錄時也不得不提供絕對路徑。比如,考慮我現在的情況,就是在 /home/himanshu/Downloads 目錄下:


  1. $ pwd
  2. /home/himanshu/Downloads

現在要求切換至 /home/himanshu/Desktop 目錄,我一般會這樣做:


  1. cd /home/himanshu/Desktop/

或者


  1. cd ~/Desktop/

或者


  1. cd ../Desktop/

能不能隻是運行以下命令就能簡單地實現呢:


  1. cd Desktop

是的,這完全有可能。這就是環境變量 CDPATH 出現的時候了。你可使用這個變量來為 cd 命令定義基礎目錄。

如果你嚐試打印它的值,你會看見這個環境變量默認是空值的:


  1. $ echo $CDPATH

現在 ,考慮到上麵提到的場景,我們使用這個環境變量,將 /home/himanshu 作為 cd 命令的基礎目錄來使用。

最簡單的做法這樣:


  1. export CDPATH=/home/himanshu

現在,我能做到之前所不能做到的事了 - 當前工作目錄在 /home/himanshu/Downloads 目錄裏時,成功地運行了 cd Desktop 命令。


  1. $ pwd
  2. /home/himanshu/Downloads
  3. $ cd Desktop/
  4. /home/himanshu/Desktop
  5. $

這表明了我可以使用 cd 命令來到達 /home/himanshu 下的任意一個目錄,而不需要在 cd 命令中顯式地指定 /home/himanshu 或者 ~,又或者是 ../ (或者多個 ../)。

要點

現在你應該知道了怎樣利用環境變量 CDPATH 在 /home/himanshu/Downloads 和 /home/himanshu/Desktop之間輕鬆切換。現在,考慮以下這種情況, 在 /home/himanshu/Desktop 目錄裏包含一個名字叫做Downloads 的子目錄,這是將要切換到的目錄。

但突然你會意識到 cd Downloads 會切換到 /home/himanshu/Downloads。所以,為了確保這不會發生,你可以這樣做:


  1. cd ./Downloads

雖然上述命令本身沒有問題,但你還是需要耗費點額外的精力(雖然很小),尤其是每次這種情況發生時你都不得不這樣做。所以,有一個更加優雅的解決方案來處理,就是以如下方式來設定 CDPATH 環境變量。


  1. 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. $ pwd
  2. /home/himanshu/Downloads
  3. $ ls Desktop
  4. ls: cannot access Desktop: No such file or directory
  5. $

然而,這還是有簡單的變通處理的。例如,我們可以用以下不怎麼費力的方式來達到目的:


  1. $ cd Desktop/;ls
  2. /home/himanshu/Desktop
  3. backup backup~ Downloads gdb.html outline~ outline.txt outline.txt~

不過,不是每種情況就能變通處理的。

另一個重點是:就像你可能已經觀察到的,每次你使用 CDPATH 環境變量集來運行 cd 命令時,該命令都會在輸出裏顯示你切換到的目錄的完整路徑。不用說,不是所有人都想在每次運行 cd 命令時看到這些信息。

為了確保該輸出被製止,你可以使用以下命令:


  1. alias cd='>/dev/null cd'

如果 cd 命令運行成功,上述命令不會輸出任何東西,如果失敗,則允許產生錯誤信息。

最後,假如你遇到設置 CDPATH 環境變量後,不能使用 shell 的 tab 自動補全功能的問題,可以嚐試安裝並啟用 bash 自動補全(bash-completion)。更多請參考 這裏

總結

CDPATH 環境變量時一把雙刃劍,如果沒有掌握完善的知識和隨意使用,可能會令你陷入困境,並花費你大量寶貴時間去解決問題。當然,這不代表你不應該去試一下;隻需要了解一下所有的可用選項,如果你得出結論,使用 CDPATH 會帶來很大的幫助,就繼續使用它吧。

原文發布時間為:2017-04-08

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-05-23 15:02:49

  上一篇:go  Samba 係列(六):使用 Rsync 命令同步兩個 Samba4 AD DC 之間的 SysVol 目錄
  下一篇:go  Greenplum數據增量導入的唯一值自增處理