在我剛開始使用Linux不久,我試圖學習一些bash命令,於是我敲下了如下的命令:
$ man bash
我立即發現bash用戶手冊簡直就是一個長篇史詩。一頁又一頁的命令、功能說明、小技巧、小說明以及非常多的環境變數。20年過去了,我到現在還是能經常在bash中發現一些新的工具和功能 ,我不知道稱呼Bash為一個工具是不是比一個代碼更為恰當。在這篇文章中我將介紹Bash的一些不常用(但是還是非常有用)的特性。
一、擴展欄位匹配
首先我們來看一個叫做擴展欄位匹配的功能。這個選項允許你執行比標準Bash所提供的更複雜的欄位匹配。例如,你可以定位除了後綴為.tmp之外的所有文件。擴展欄位匹配功能可
以通過shopt命令啟用,或者內置的shell選項:
$ shopt -s extglob
備註:你還可以運行shopt命令來查看其它選項、特性和它提供的一些秘密功能。
一旦啟用,我們可以用一個簡單的語法列出某個目錄中除去後綴為.tmp的所有文件:
$ ls !(*.tmp)
你還可以使用多個參數:
$ ls !(*.tmp|*.log|*.bak)
你可以選擇使用其它幾個extglob的參數,比如:
?(pattern-list) Matches zero or one occurrence of the given patterns
*(pattern-list) Matches zero or more occurrences of the given patterns
+(pattern-list) Matches one or more occurrences of the given patterns
@(pattern-list) Matches exactly one of the given patterns
!(pattern-list) Matches anything except one of the given patterns
二、cdspell shell選項
Cdspell是另一個很有用並且少為人知的shell命令。Cdspell命令可以更正在cd命令中出現的小的拼寫錯誤。你可以通過shopt命令行來啟用cdspell選項。
$ shopt -s cdspell
舉個例子,現在我們試著輸入一個簡單的關於更改目錄的錯誤命令:
$ cd /ect
/etc
很快你能發現這個小錯誤被自動更正過來了,並且bash已經讓你成功更改到了正確的目錄下。
$ pwd
/etc
Cdspell選項可以自動更正字母順序拼寫錯誤的單詞,漏了字母的單詞,還可以去掉單詞中多餘的字母。
三、更好地管理Bash命令歷史記錄
Bash中最有用的功能之一就是可以自動記憶你曾經使用過的命令。你可以用history命令來列出一系列之前執行過的命令。然後你可以在bash shell中用嘆號標註來找回並且執行之前的命令。例如,你可以從歷史記錄中通過數字列出某條命令:
$ !110
這樣可以運行歷史記錄中的第110條命令。或者你也可以通過名稱來指定某條命令:
$ !wget
這樣執行最近的一條wget命令。
以下這種用法很少人知道:
$ !:0
這可以返回之前執行過的命令行中的命令欄位,例如:
$ wget http://www.google.com
$ !:0
$ wget
如果不需要命令,只需要返回命令之後的參數,你可以用這個命令:
$ mkdir /tmp/newdirectory
$ cd !*
cd /tmp/newdirectory
然後,你的歷史記錄有可能因為重複使用而變得混亂,而且你會希望只返回一些比如ls或者ps命令這樣的結果。Bash有一個叫做$HISTIGNORE的環境變數,它可以只記憶那些你想要的命令,而不是所有命令。讓我們看看我的$HISTIGNORE設置:
$ HISTIGNORE="&:history:ls:ls * ps:ps -A:[bf]g:exit"
這個設置可以避免記錄重複記錄(&號),然後所有ls,ls*ps和ps-A,還有bg,fg和內置的exit命令都將被記錄在歷史列表中。另一個有用的小技巧就是加一個[ \t]*參數,可以避免所有以空格開始的命令被記錄在歷史列表中。最後,我們只要輸出它就可以了:
$ export HISTIGNORE
四、互動式歷史命令搜索
你以前知道這件事情嗎,就是你可以互動式地搜索你的Bash歷史命令,從而更好地整理好它?你可以輸入Ctrl-r來啟用這個搜索功能(這個可以對Emacs用戶來說比較熟悉,就像Emacs一樣,你可以用Ctrl-a和Ctrl-e到達命令行的開始或者結尾,象其它快捷鍵一樣)。這會啟動以下命令:
(reverse-i-search)`':
然後你可以輸入一個命令或者命令的一部分來搜索你的Bash歷史命令,系統會列出匹配的命令。如果找到你需要的命令你可以通過敲擊回車鍵來運行它或者敲ESC鍵來編輯匹配的命令行。
五、非別名命令
多數人都知道如何使用別名命令,它允許你創建自定義版本的命令,比如給rm命令加一個-r參數,或者給mkdir加一個-p參數:
$ alias rm='rm -r'
$ alias mkdir='mkdir -p'
你也可以不加標記的運行一個別名命令來獲得一個當前可用的別名命令列表。
但是你可能不知道非別名命令。這可以讓你在無需別名的情況下運行一個命令:
$ unalias rm /tmp/file
你還可以用\參數來獲得相同的結果:
$ \rm /tmp/file
這將執行rm命令,而不需要象在別名命令中一樣手動去加-r參數。
下面介紹另外五個同樣十分實用的Bash命令:
更改Bash導航
大多數人都知道Bash的導航命令。用Emacs作編輯器的人對它們更是相當熟悉。它們包括:
Ctrl + a - 返回到當前命令的開始
Ctrl + e - 返回到當前命令的末尾
Ctrl + w - 刪除游標左邊的第一個條目(變數或者命令)
Ctrl + u - 剪切游標前面的所有內容
Ctrl + y - 剪切游標後面的所有內容
Ctrl + y - 粘貼你用Ctrl +u或者Ctrl + y剪切的內容
Ctrl + p - 滾動顯示以前的命令
Ctrl + n - 下一個命令
Ctrl + l - 清屏
你可能不知道Bash不僅能夠使用Emacs編輯模式,而且還能夠使用vi模式(為那些更喜歡用vi命令的人準備)。你可以用下面的命令切換到vi編輯模式:
$ set -o vi
你還可以把這個命令添加到你的.bashrc文件中,以便永久地切換到vi模式:
$ set -o vi >> ~/.bashrc
現在你就可以用vi模式使用命令行了。比如,你可以用vi命令模式進行導航。按Esc鍵進入命令模式,然後你就可以使用以下命令:
l - 向前移動一個字元
h - 向後移動一個字元
0(零) - 把游標移動到該行最前面
$ - 把游標移動到行末
w - 往前移一個字
b - 往後移一個字
然後你可以按Esc鍵退出命令模式,或者像vi一樣按A或I鍵進入插入模式,對命令行進行編輯。按enter鍵會執行當前命令。
如果你決定不用vi模式,你可以鍵入以下命令返回emacs模式:
$ set -o emacs
你還可以用命令:
$ bind –P
來顯示你的所有命令以及它們的按鍵設置。你也可以用該bind命令對各種函數設置自己的按鍵組合。
cd –命令
你可以使用:
$ cd –
返回你原來所在的目錄,你可以重複使用該命令返回上一級目錄。
設置命令的輸出路徑
有時候你想告訴人們你的命令行發生了什麼事情,但是又不想讓他們擁有訪問權。有一種快捷、簡便的方法可以解決這個問題:使用腳本和nc命令在網路上顯示你的命令行發生了哪些變化,只需輸入:
$ script -f >(nc -l 8000)
這個命令會把所有在命令行中鍵入的內容輸送到網路上,所有使用監聽埠8000的人都能夠看到你用nc命令鍵入的內容。
$ nc host 8000
文件首次重定向
我喜歡那些讓我少打字的技巧。通常你想要用多種方式處理同一個文件。使用重定向,我們可以首先指定文件的名字,以及結束時執行的命令。
這裡我們指定了我們想要預先搜索的文件,然後指定了grep命令和我們想要查找的文本。現在如果我們想要從歷史中檢索該命令,我們只需要編輯要再次搜索的文本就可以了。
三個有用的查找(find)命令
最後,我要分享三個我經常使用的、非常有用的查找命令。Find命令是一個非常強大的小工具,尤其是與-exec選項搭配的時候,它們允許你在查找的結果中執行命令。我建議你閱讀一下find的說明,以便更深入的使用該命令。
第一個命令:查找並列出當前目錄中過去一天修改的所有文件。
$ find ./ -type f -mtime -1 -exec ls -al {} \;
你顯然可以修改該命令,以便查找其他地方、不同時間(把-1改成不同的時間)的文件。
第二個命令:查找文件,然後執行一個基於Perl的尋找-替換功能。
$ find . -name '*.txt' -type f -exec perl -pi -e 's/goldfish/tiger/g' {} \;
在這種情況下,我們查找所有擴展名為.txt的文件,並在這些文件中查找單詞“goldfish”,把這個單詞替換成“tiger”。
最後一個查找命令:我經常用它從我的路徑中遞歸刪除.svn(和其他的)目錄。
find . -name ".svn" -exec rm -rf {} \;
[火星人 ] Linux操作系統下的實用bash命令分享已經有396次圍觀