history命令是bash shell 內置命令,history命令有助於咱們縮短輸入命令的時間,達到節省命令快捷操做的要求。咱們也能夠經過查詢history命令,從而審計操做日誌。同時,咱們能夠隱藏一些含有敏感信息的命令輸入,使系統更加安全。linux
語法:web
history [n | -c | -rnaw histfile]
參數:shell
n:數字,列出最近的 n 條歷史命令緩存
-c:將當前shell 緩存中的 history 內容所有清除安全
-a:將當前shell緩存中的history 內容append附加到 histfile 中,若是沒有指定 histfile,則默認寫入 ~/.bash_histroybash
-r:將 histfile 中的內容讀取到當前shell的緩存中服務器
-w:將當前shell緩存的history歷史列表寫入到指定的文件
app
-a: 追加本次會話新執行的命令歷史列表至歷史文件,由於多終端因此若是想看當前都發生了什麼操做就能夠執行-a進行查看
-n: 讀歷史文件(本地數據)中未讀過的行到歷史列表(內存數據)
-r: 讀歷史文件(本地數據)附加到歷史列表(內存數據)
-w: 保存歷史列表(內存數據)到指定的歷史文件(本地數據)
-s: 展開歷史參數成一行,附加在歷史列表後。用於僞造命令歷史ide
n:數字,列出【最近】的 n 條歷史命令,默認爲10學習
[root@web ~]# history 5 997 ls 998 exit 999 history 1000 exit 1001 history
-c : 清空命令歷史(使用該命令以後,僅對當前shell進程生效, exit 退出後從新進入,原來 .bash_history的內容會從新入讀內存中)
要想完全清空歷史命令,須要先將 .bash_history的內容刪除,接着使用 history -c, 這樣纔會完全清空命令歷史。
[root@web ~]# history ... 996 pstree 997 exit 998 tail -f /var/log/ldap.log 999 ls 1000 exit 1001 history [root@web ~]# history -c [root@web ~]# history 3 history [root@web ~]# > .bash_history [root@web ~]# exit logout
-d:刪除歷史命令中指定的的記錄; 好比咱們想刪除命令歷史中的999行命令記錄,直接使用 history -d 999 便可,而後用 history 查看命令的最後幾行,發現原來999行的歷史命令被下一行的命令所取代
[root@web ~]# history 10 997 ls 998 exit 999 history 1000 exit 1001 history 1002 vi .bash_history [root@web ~]# history -d 999 [root@web ~]# history 10 998 exit 999 exit 1000 history 1001 vi .bash_history 1002 ls 1003 history 1004 history 5 1005 history 10 1006 history -d 999 1007 history 10
-r:讀取歷史文件到歷史列表(將 .bash_history從新讀取一遍,寫入到當前bash進程的內存中)
(若是當前兩個終端同時登陸Linux系統, root(tty1)輸入 n 條命令, root(tty2)也輸入 m 條命令而且將內存中的命令歷史經過 histroy -a 刷新到 .bash_history文件中, 那麼 root(tty1)能夠直接執行 history -r ,將root(tty2)寫入到 .bashr_history文件中記錄直接讀取到 當前bash進程的histoty命令歷史內存中)
-a:將bash 內存中歷史命令追加到 .bash_history 歷史命令文件中, 默認只有退出 shell 是纔會保存
-w:保存歷史列表到指定的歷史文件(history -w /PATH/TO/SOMEFILE 將內存中命令執行的歷史列表保存到指定的 /PATH/TO/SOMEFILE中)
[root@web ~]# history -w /tmp/history.log [root@web ~]# cat /tmp/history.log ps -ef ls ls -l cat /etc/issue history -w /tmp/history.log
# !n :調用第n條命令
# !-n:調用倒數第n條命令
# !!:執行上一條命令
# !$:引用前一個命令的最後一個參數同組合鍵Esc,.
# !n:^ 調用第n條命令的第一個參數
# !n:$ 調用第n條命令的最後一個參數
# !m:n 調用第m條命令的第n個參數
# !n:* 調用第n條命令的全部參數
# !string:執行命令歷史中最近一個以指定string開頭的命令
# !string:^ 從命令歷史中搜索以string 開頭的命令,並獲取它的第一個參數
# !string:$ 從命令歷史中搜索以string 開頭的命令,並獲取它的最後一個參數
# !string:n 從命令歷史中搜索以string 開頭的命令,並獲取它的第n個參數
# !string:* 從命令歷史中搜索以string 開頭的命令,並獲取它的全部參數
經常使用的快捷鍵
執行上一次命令
!!
搜索歷史命令:
Ctrl + R
從新調用前一個命令中最後一個參數:
!$
Esc + .(點擊Esc鍵後鬆開,而後點擊. 鍵)
這兩個很經常使用,特別是Esc + .
咱們在建立文件後,一般會對其進行修改或其餘的讀操做,這時候鍵入命令後利用上述快捷鍵便可快速補全所需命令。
history工做機制:當用戶登陸系統並啓動bash時,會讀取 histfile 變量指定文件中的歷史記錄到當前shell進程的內存中,咱們在此bash中的全部操做,也會緩存在內存裏面, 只有在bash退出後,纔會把內存中的歷史記錄 flush 到 histfile 變量指定的文件中。
因此會出現這種狀況:
我和同事用不一樣的機器登陸到同一臺linux服務器上, 我用history命令只能查看本身終端所操做的命令,若是我也想看到全部鏈接到此服務器的終端所操做的命令,應該如何操做呢?
回答是: 看不到, 在用戶退出登陸以前,命令歷史記錄所有在內存中,沒有寫入到文件。
一般 .bash_history 在每一個用戶的 $HOME 目錄下,但這是查看上次用戶所操做的歷史記錄。
HISTFILESIZE:命令歷史文件記錄的條數
HISTSIZE:命令歷史記錄的條數
[root@web ~]# echo $HISTSIZE 1000
HISTFILE:指定歷史文件,默認爲每一個用戶家目錄下: ~/.bash_history
HISTTIMEFORMAT="%F %T ":顯示時間,能夠記錄命令執行的時間
[root@web ~]# HISTTIMEFORMAT="%F %T " [root@web ~]# history 10 2017-06-23 07:05:15 ps -ef 11 2017-06-23 07:05:16 ls 12 2017-06-23 07:05:18 ls -l 13 2017-06-23 07:05:29 cat /etc/issue
HISTTIMEFORMAT="$(hostname) %F %T ":顯示更加詳細的主機名和命令執行時間
[root@web ~]# HISTTIMEFORMAT="$(hostname) %F %T " [root@web ~]# history 10 web 2017-06-23 07:05:15 ps -ef 11 web 2017-06-23 07:05:16 ls
HISTTIMEFORMAT="$(tty) %F %T ":顯示用戶登陸終端和命令執行時間
[root@web ~]# HISTTIMEFORMAT="$(tty) %F %T " [root@web ~]# history 10 /dev/pts/2 2017-06-23 07:05:15 ps -ef 11 /dev/pts/2 2017-06-23 07:05:16 ls
HISTIGNORE="str1:str2:...": 忽略以冒號分隔的 str1, str2 歷史記錄
會忽略接下來輸入凡有 str1:str2 的命令
控制命令歷史的記錄方式
HISTCONTROL=
ignoredups:忽略重複的命令, 「連續且相同」方爲【重複】
ignorespace:忽略全部以空白開頭的命令
ignoreboth:ignoredups && ignorespace
erasedups:刪除重複命令,減少 history 的大小
注意:命令直接在命令行進行環境變量的設置,執行時間段僅限於該腳本,設置完變量會當即生效,可是exit退出當前腳本以後,環境變量就會失效;將環境變量寫入配置文件中,/etc/profile(全局變量,對全部用戶有效)或 ~/.bash_profile(單用戶模式,僅對該用戶有效),寫入配置文件中不會當即生效,可是須要從新登陸以後生效。
參考:
http://www.tuicool.com/articles/B7FFVrm