"忘記歷史的Linux使用者註定要輸入很多資訊。”
這也讓強有力的歷史命令(包括Bash shell的歷史變體)不僅在援引之前執行命令而不需重新輸入它們時有用,在呼叫其它很少用到的命令時也有用,這省去了必須重新使用它們的麻煩。該命令按時間順序列出了之前執行命令的清單。
該命令的輸出示例如下:
01 |
$ history |
02 |
... |
03 |
62 rm 092210.sql |
04 |
63 mysqldump |
05 |
64 mysqldump -u root -p dev_gamenomad_com > 092210.sql |
06 |
65 more 092210.sql |
07 |
66 rm 092210.sql |
08 |
... |
09 |
9991 mkdir chapter05 |
10 |
9992 cd chapter05 |
11 |
9993 dir |
12 |
9994 npm install websocket-server |
13 |
9995 node hello.js |
14 |
9996 exit |
15 |
9997 history |
與每條命令相關的順序號服務於重要目的,允許使用者通過提供直接跟著感嘆號的順序號來重新執行相關命令,如下:
1 |
$ !10000 |
2 |
sudo /etc/init.d/apache2 start |
3 |
* Starting web server apache2 |
但這並不是全部。Linux歷史命令能做到更多,本文後續部分也將提及。
掌控歷史擴充套件
敲擊向上箭頭鍵會顯示之前執行的命令,敲擊Enter鍵會再次執行該命令。但是還可以使用另一個可能更快的包括歷史擴充套件功能的選擇:
$ !!
如果你重複執行同樣兩條或三條命令的不同排列組合,你還可以選擇通過識別其位移負指數來執行出現在上一命令出現處的命令。例如,執行之前命令的前一命令(回退兩條命令),運用以下序列:
$ !-2
執行早期命令的另一方式是輸入緊跟著感嘆號的命令序列號的開頭。符合字元物件的第一條命令會執行。舉例來說,假設最後三條命令如下:
$ history ... 9876 build-book /home/wjgilmore/easy_php 9877 mkdir chapter05 9878 cd chapter05 9879 touch chapter05.md
你可以只通過執行以下命令來再次執行構書指令碼:
$ !b
用兩步過程建立一個確認它的新目錄和導航和以運用歷史擴充套件縮短。在本例中,我建立了一個叫做easy_bash的新目錄,位置在/home/wjgilmore/books。要確認該目錄,運用!$來獲得在前一命令中發現在最後“字元”:
$ mkdir /home/wjgilmore/books/easy_bash $ cd !$
搜尋命令歷史
雖然可以翻閱命令歷史(或使用grep命令),但在使用Ctrl+R開放選擇搜尋它之後也可以呼叫該命令的片段,提示的命令列將如下所示:
(reverse-i-search)`':
開始輸入命令片段,命令列會實時更新反映出最符合的一條。輸入apa後會出現類似於這樣的命令:
(reverse-i-search)`apa': sudo /etc/init.d/apache2 start
當你看到想要的命令,敲擊Enter執行它,或者敲擊向上箭頭鍵在重新執行前修改它。
調整歷史行為
你可以做很多有趣的設定更改來控制命令歷史的行為方式。例如,Bash shell設定的預設歷史大小是500條記錄,這個限制很快就達到了,即使是很小的命令列相互作用。你可以通過設定在Bash配置檔案(.bashrc,位於主目錄中)上發現的HISTSIZE變數提高限制數。
HISTSIZE=10000
你在命名為HISTCONTROL的.bashrc中通常還會遇到另一個與歷史有關的變數。該變數幫助明確規定歷史檔案中的存放內容(位於.bash_history,也可見於主目錄中)。例如,你也許在檢查最新的日誌檔案附件時重複執行了尾命令,就在執行tail的幾分鐘裡。通過重複來叢集歷史檔案不太實際,通過設定它為ignoredups來讓HISTCONTROL變數忽視複製行。
HISTCONTROL=ignoredups
可疑效用的另一個HISTCONTROL設定是忽略空格。該HISTCONTROL設定的結果是所有前面有空格的執行命令都從歷史檔案中刪除。這對於不跟蹤每條命令似乎起了反作用,但是如果你除了ignoredups之外還想實現該功能,你可以將兩者設定成:
HISTCONTROL=ignoreboth
我最後要談及的一個功能是命令替換。假設你想基於一個虛擬主機配置檔案模板快速配置一群虛擬主機。這些命令序列可能非常長,就像下面所示:
$ cp vhost.template /etc/apache2/sites-available/dev.example.com $ cp vhost.template /etc/apache2/sites-available/forum.example.com $ cp vhost.template /etc/apache2/sites-available/staging.example.com
通常你執行該一列命令的方法會是首先輸入和執行,接著向上滾動、刪除尾行片段(dev.example.com),然後輸入下一片段(forum.example.com),然後重新執行。另一種方法,你可以運用命令替換來快速地用一行字串替換另一相關字串,如下所示:
$ !!:s/dev/forum
該命令列在指向-點選介面中已為使用者帶來了大量好處,讓任務執行和作業系統導航可以快速且優雅地完成。最大程度上地利用歷史命令只能增加這些功能,促進生產力會走得更遠。