閱讀725 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

到目前為止,在該係列指南中,我們已經討論了 cd - 和 pushd/popd 命令的基本使用方法和相關細節,以及CDPATH 環境變量。在這第四期、也是最後一期文章中,我們會討論別名的概念以及你可以如何使用它們使你的命令行導航更加輕鬆和平穩。

一如往常,在進入該指南的核心之前,值得指出本文中的所有命令以及展示的例子都在 Ubuntu 14.04LTS 中進行了測試。我們使用的命令行 shell 是 bash(4.3.11 版本)。

Linux 中的命令行別名

按照外行人的定義,別名可以被認為是一個複雜命令或者一組命令(包括它們的參數和選項)的簡稱或縮寫。所以基本上,使用別名,你可以為那些不那麼容易書寫/記憶的命令創建易於記憶的名稱。

例如,下麵的命令為 cd ~ 命令創建別名 home


  1. alias home="cd ~"

這意味著現在在你的係統中無論何地,無論何時你想要回到你的主目錄時,你可以很快地輸入 home 然後按回車鍵實現。

關於 alias 命令,man 手冊是這麼描述的:

alias 工具可以創建或者重定義別名定義,或者把現有別名定義輸出到標準輸出。別名定義提供了輸入一個命令時應該被替換的字符串值

一個別名定義會影響當前 shell 的執行環境以及當前 shell 的所有子 shell 的執行環境。按照 IEEE Std 1003.1-2001 規定,別名定義不應該影響當前 shell 的父進程以及任何 shell 調用的程序環境。

那麼,別名到底如何幫助命令行導航呢?這是一個簡單的例子:

假設你正在 /home/himanshu/projects/howtoforge 目錄工作,它包括很多子目錄以及子子目錄。例如下麵就是一個完整的目錄分支:


  1. /home/himanshu/projects/howtoforge/command-line/navigation/tips-tricks/part4/final

現在想象你在 final 目錄,然後你想回到 tips-tricks 目錄,然後再從那裏,回到 howtoforge 目錄。你會怎麼做呢?

是的,一般情況下,你會運行下麵的一組命令:


  1. cd ../..
  2. cd ../../..

雖然這種方法並沒有錯誤,但它絕對不方便,尤其是當你在一個很長的路徑中想往回走例如說 5 個目錄時。那麼,有什麼解決辦法嗎?答案就是:別名。

你可以做的是,為每個 cd .. 命令創建容易記憶(和書寫)的別名。例如:


  1. alias bk1="cd .."
  2. alias bk2="cd ../.."
  3. alias bk3="cd ../../.."
  4. alias bk4="cd ../../../.."
  5. alias bk5="cd ../../../../.."

現在無論你什麼時候想從當前工作目錄往回走,例如說 5 個目錄,你隻需要運行下麵的命令:


  1. bk5

現在這不是很簡單嗎?

相關細節

盡管當前我們在 shell 中用於定義別名的技術(通過使用 alias 命令)實現了效果,別名隻存在於當前終端會話。很有可能你會希望你定義的別名能保存下來,使得此後你可以在任何新啟動的命令行窗口/標簽頁中使用它們。

為此,你需要在 ~/.bash_aliases 文件中定義你的別名,你的 ~/.bashrc 文件默認會加載該文件(如果你使用更早版本的 Ubuntu,我沒有驗證過是否有效)。

下麵是我的 .bashrc 文件中關於 .bash_aliases 文件的部分:


  1. # Alias definitions.
  2. # You may want to put all your additions into a separate file like
  3. # ~/.bash_aliases, instead of adding them here directly.
  4. # See /usr/share/doc/bash-doc/examples in the bash-doc package.
  5. if [ -f ~/.bash_aliases ]; then
  6. . ~/.bash_aliases
  7. fi

一旦你把別名定義添加到你的 .bash_aliases 文件,該別名在任何新終端中都可用。但是,在任何其它你定義別名時已經啟動的終端中,你還不能使用它們 - 解決辦法是在這些終端中重新加載 .bashrc。下麵就是你需要執行的具體命令:


  1. source ~/.bashrc

如果你覺得這要做的也太多了(是的,我期待你有更懶惰的辦法),那麼這裏有一個快捷方式來做到這一切:


  1. "alias [the-alias]" >> ~/.bash_aliases && source ~/.bash_aliases

毫無疑問,你需要用實際的命令替換 [the-alias]。例如:


  1. "alias bk5='cd ../../../../..'" >> ~/.bash_aliases && source ~/.bash_aliases

接下來,假設你已經創建了一些別名,並時不時使用它們有一段時間了。突然有一天,你發現它們其中的一個並不像期望的那樣。因此你覺得需要查看被賦予該別名的真正命令。你會怎麼做呢?

當然,你可以打開你的 .bash_aliases 文件在那裏看看,但這種方式可能有點費時,尤其是當文件中包括很多別名的時候。因此,如果你正在查找一種更簡單的方式,這就有一個:你需要做的隻是運行 alias 命令並把別名名稱作為參數。

這裏有個例子:


  1. $ alias bk6
  2. alias bk6='cd ../../../../../..'

你可以看到,上麵提到的命令顯示了被賦值給別名 bk6 的實際命令。這裏還有另一種辦法:使用 type 命令。下麵是一個例子:


  1. $ type bk6
  2. bk6 is aliased to `cd ../../../../../..'

type 命令產生了一個易於人類理解的輸出。

另一個值得分享的是你可以將別名用於常見的輸入錯誤。例如:


  1. alias mroe='more'

最後,還值得注意的是並非每個人都喜歡使用別名。他們中的大部分人認為一旦你習慣了你為了簡便而定義的別名,當你在其它相同而不存在別名(而且不允許你創建)的係統中工作時就會變得非常困難。更多(也是更準確的)為什麼一些專家不推薦使用別名的原因,你到這裏查看。

總結

就像我們之前文章討論過的 CDPATH 環境變量,別名也是一把應該謹慎使用的雙刃劍。盡管如此也別太喪氣,因為每個東西都有它自己的好處和劣勢。遇到類似別名的概念時,更多的練習和完備的知識才是重點。

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

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

最後更新:2017-05-22 15:32:24

  上一篇:go  對麵的程序員看過來,這樣你也能當型男
  下一篇:go  小白學數據 | 28張小抄表大放送:Python,R,大數據,機器學習