Bash history命名配置及使用

歷史是寶貴的財富,當然也包括編程的時候。

bash history有多種使用方式,最簡單的方式就是按上下方向鍵。按一次“上”鍵,bash列出上次運行的命令,按兩次,bash則列出再上次運行的命令;按“下”鍵正好相反,bash列出當前命令之後運行過的命令。

方向鍵按幾次還受得了,如果想運行的命令距離太遠,超過了重新輸入一遍的代價,就不值得使用這種方式了。這時我們有兩種選擇:使用history命令或bash內置的查找功能。

history會列出bash保存的所有歷史命令,並且給它們編了號,我們可以使用“歎號接編號”的方式運行特定的歷史命令,如:

$ history
...
100 echo "hello, world"
...
$ !100
echo "hello world"
hello world

更高效的方式是結合grep的搜索功能,如:

$ history | grep echo

通常情況下,我們可以使用bash內置的字符串搜索功能,按Ctrl+r,然後輸入自己想搜索的內容,bash會顯示出最近一條匹配的命令,連續按Ctrl+r則繼續搜索前面的歷史命令。按回車執行當前顯示的命令,按Ctrl+g放棄搜索。“奇怪”的是,我們並不總能搜索到自己以前輸入的命令,原來,bash缺省只保存500條歷史命令,我們不妨多保存一些,“前事不忘,後事之師”嘛。通過將下面的代碼加入到.bashrc文件裏就能做到。

# 忽略重複的命令
export HISTCONTROL=ignoredups
# 忽略由冒號分割的這些命令
export HISTIGNORE="[   ]*:&:bg:fg:exit"
# 設置保存歷史命令的文件大小
export HISTFILESIZE=1000000000
# 保存歷史命令條數
export HISTSIZE=1000000

可怎麼還是有些命令不在歷史裏面呢?原來,bash缺省使用覆蓋的方式將執行過的命令寫到文件裏,包括bash啓動時從歷史命令文件裏讀出的命令,以及之後運行的命令。更重要的是,寫回的時機是在bash退出時。想想看,如果一先一後啓動兩個bash回出現怎樣的情況?

  1. 第一個bash啓動,讀出100個歷史命令;
  2. 之後執行了50條命令
  3. 開啓第二個bash,由於前面的bash沒有退出,所以第二個bash只讀到100條歷史命令
  4. 在第二個bash裏面執行10條命令
  5. 第一個bash退出,將150條命令用覆蓋的方式寫回文件
  6. 第二個bash退出,歷史文件裏只有110條命令!!!

解決方法是使用追加而不是覆蓋的方式將命令寫入文件,將下面的代碼放在.bashrc文件裏即可:

shopt -s histappend

然而,bash只在退出的時候纔將新近執行的命令寫回文件的方式仍然困擾着我們,使得我們在第二個bash裏面不能重用第一個bash裏面執行的50條命令。解決方法是每執行完一條命令就將其寫回文件。bash每執行完一條命令,都要顯示一個新的提示符,而在顯示提示符的同時,會執行保存在環境變量PROMPT_COMMAND裏面的命令(通常被用來爲終端設置標題),利用這一機制,將如下代碼放入.bashrc文件裏即可達到目的:

PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

現在,第二個bash啓動時可以讀到150條命令,如果再開第三個bash的話可以讀到160個命令。然而,第一個bash卻無法重用第二個bash裏面執行的10條命令,因爲bash在啓動後不會再去讀歷史文件了。

將如下代碼插入.inputrc,會讓搜索變得更容易。

"\e[A": history-search-backward
"\e[B": history-search-forward

當命令行上沒有輸入時,上下方向鍵的作用和以前一樣,但是當輸入了內容,如ssh -l,之後,bash只會列出以該字符串開頭的命令,這樣極大地縮小了搜索範圍,非常高效。


轉自:http://www.wanglianghome.org/blog/2007/05/bash-history.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章