標籤:
對於Terminalor們,history命令並不陌生,什麼!n, !!更是很常用的,而且您在命令列敲的cmds是預設儲存在/home/$USER/.bash_history(linux)
/Users/$USER/.bash_history(Mac)下的。
但是history不只是這個樣子:存了命令然後可以查看調用。
先介紹幾個與history相關的變數,控制history的行為和size
HISTIGNORE (hist-ignore) 告訴history哪些命令不需要儲存,直接把它們忽略掉。
例如我的是:
HISTIGNORE="ls *:ll:ls:l:ll *:freq*:cd *:*.log:dl:dc:des:bi:pic:sublime:brackets:open*"
就是把常用的ls命令們忽略掉,這些都是很常用但是很少被再利用的“廢料“,cd到哪哪哪也沒用,還有就是查看log檔案的也沒用,freq*是我把常用的目錄alias的
例如 alias freq1="cd ~/Edge/dl/GSE38600/NEW"
還有 dl dc des pic bi都對應一個alias, alias dl="cd ~/Downloads"這樣的
還有 sublime brackets是我常用的editor,在Mac中是alias sublime="open -a sublime\ text",linux下直接用subl就好了
open*也是Mac下的
對於在Debian類的Linux系統的,常用的apt-get類命令可以alias
alias update="sudo apt-get update"
alias upgrade="sudo apt-get upgrade | tee ~/Documents/`date +%F_%H:%M:%S`-upgrade.log"
alias dist-upgrade="sudo apt-get dist-upgrade | tee ~/Documents/`date +%F_%H:%M:%S`-dupgrade.log"
alias remove="sudo apt-get remove"
alias install="sudo apt-get install"
alias purge="sudo apt-get purge"
...
然後把update,upgrade,dist-upgrade等添加到HISTIGNORE中
HISTSIZE 表示最多可以存多少條命令,預設的你可以看.bashrc或者.bash_profile裡面一般把這個變數定義為1000
超過這個數字會自動把原來的命令擠出去,相當於一個隧道一樣的。
但是真的很不夠用的,我把HISTSIZE定義為1,000,000反正暫時也達不到這個要求,一般100,000也要很久才能達到
一般可以檔案到了一定的大小把它備份了,再重新開始一個檔案存,備份的可以寫個bash函數並結合history來一起查看新舊檔案
HISTFILESIZE 表示檔案的最大大小,預設也是1000,自己按照自己的實際cmd量,DIY
HISTTIMEFORMAT (hist-time-format)當然是記錄你敲的這條命令的時間,格式和·date·是一樣的
我的是定義為:
HISTTIMEFORMAT="%F#%H:%M:%S " >>>>> 2015-04-08#04:27:32
HISTTIMEFORMAT="%F#%T " >>>>> 2015-04-08#04:27:32
[注意這個時間不會存到.bash_history中的,只是你用history查看的時候顯示]
HISTCONTROL 相當於是.bash_history的品質(品質)控制,有ignoredups,erasedups (就是ignore duplicates,和 erase duplicates)
假如選擇ignoreredups,就是忽略連續的重複,不連續的沒作用。
假如你在調試一個程式,不停地 perl bowtie2_all.pl,假如嘗試20次後最終成功的,但是history中就有了20條命令,
當然你可以應HISTIGNORE把這條命令忽略掉,但是很不明智,HISTCONTROL就可以啦,它會在存入時檢查要存的命令是否合上一條一樣
重複的話就忽略,也就是不存入
假如選擇erasedups,當然會在存入時把要存入的命令和以後的所有命令比對一次,如果有重複的話,就會把這條命令不存入
還有一個trick:可以選擇 ignorespace,意思就是,你在輸入命令的時候如果最開始有一個空格,那麼就會不存入這條命令,所以
你就可以把不想存入的命令前面加一個或者多個空格來忽略它。
HISTFILE當然就是自訂你要把命令存到哪裡,預設是~/.bash_history,當然如果你不想存這兒,就指定要存的地方,OK。
例如 HISTFILE="/home/$USER/Backup/bash_2015_history"
[注意最好用絕對路徑]
注意,這些變數的定義存入.bashrc,然後再命令列 source ~/.bashrc,意思就是把我修改過的.bashrc中的設定覆蓋已經讀到記憶體中的設定(以後開啟的terminal都會用這個設定,在source之間開啟的,除了這個視窗,都保持原來的設定)
很討厭用export來匯入,因為在你關掉這個Terminal或者重啟之後這個設定就沒有了,因為每次開啟Terminal都會重讀.bashrc
當然我直接把export VARIABLE=CONTENT寫入.bashrc不就好了,但是直接用VARIABLE=CONTENT就好了,何必再多敲7個字元呢
還有就是,所有的你在這個視窗中敲的命令會在這個視窗exit或者close後才寫入.bash_history中,(緩衝機制),如果想敲一條寫一條的話,呵呵,來一個trick
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
PROMPT_COMMAND就是.bash_rc中定義的PS1啦,也就是每次的[email protected] : ~ $,上面的trick就是在每次Prompt前將命令存入,-a可以指定其他檔案名稱,
但預設是.bash_profile
由於bash的history檔案預設是覆蓋,如果存在多個終端,最後退出的會覆蓋以前記錄,改為追加形式:shopt -s histappend,不過預設在.bashrc中是有的,無需再填
history N 查看最新存入的N條命令: 相當於 history | tail -n N
!N 查看並運行存入的第N條命令: history | sed -n ‘Np‘(只查看的話)
!! 查看並運行上一條命令
!STR 查看以STR打頭的命令
但是我更喜歡 : alias hist="history | grep "
-w / -r/ -c 分別是 write to / read from / clear
Ctrl + R 也是常用的history搜尋
Reference:
1. http://www.jb51.net/LINUXjishu/157030.html
2. http://blog.csdn.net/dyllove98/article/details/9412805
history and its relevant variables in Linux/GNU and Mac OS history命令以及相關環境變數