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