bash中的歷史記錄機制

基本用法

顯示歷史記錄

使用history能夠查看當前用戶最近執行的HISTSIZE條命令,這些記錄被存儲在HISTFILE文件中,在bash啓動時會自動加載到歷史記錄緩衝隊列,其簡單使用方法以下:shell

> history  # 顯示所有歷史記錄
    1  ip a
    2  exit
    3  ls -la
    4  history
> history 2  # 顯示最後兩條歷史記錄
    4  history
    5  history 2

搜索與批量查詢

使用Ctrl + R快捷鍵能夠進入歷史記錄搜索模式,根據用戶輸入的字符按照最近最類似原則將搜索結果打印到命令提示符後面,輸入回車能夠直接執行這條結果。另外一種方式是使用grep配合管道進行批量搜索:安全

> history | grep ffmpeg | grep gif | grep yuv444p  
 119  ffmpeg -y -f gif -i 79557166.gif -c:v libx264 -vf format=yuv444p yuv444p.mp4  
 120  ffmpeg -y -f gif -i 79557166.gif -c:v libx264 -vf format=yuv444p yuv444p.mkv

當即執行(危險)

使用!!可以當即執行歷史記錄中的最後一條命令,也就是重複上一條命令;使用![number]可以根據number執行對應編號的歷史命令;使用![string]可以根據string按照最近最類似原則執行歷史命令。這類命令最人性化的是會在執行前打印要執行的命令(讓你知道系統是怎麼掛的)。bash

> date
Sun 23 Feb 2020 06:18:16 PM CST
> !!  # 不安全
date  
Sun 23 Feb 2020 06:18:18 PM CST
> !907  # 危險
make  
make: \*\*\* No targets specified and no makefile found.  Stop.
> !shut  # 很是危險
shutdown now

經過!開頭的命令直接執行對應的歷史記錄是十分危險的,尤爲是在高權限用戶環境下,所以建議在執行以前經過如下方式查看對應的命令:服務器

> !!:p      #查看記錄中最後一條命令
> !123:p    #查看記錄中第123條命令
> !sys:p    #查看記錄中sys開頭的最近一條命令

刪除記錄

使用history -d <hist_num>能夠刪除指定序號的歷史記錄,該模式只接收一個參數,其餘參數會被忽略,利用這一特性能夠實如今bash中執行不被記錄的命令。session

> echo "secret command";history -d $(history 1)
secret command

若是你想徹底清除當前會話內的使用痕跡,能夠使用history -c清空歷史記錄緩衝隊列,值得注意的是這個命令不會清空歷史記錄文件。app

[warning] 注意:除了上述方法外,用戶還能夠經過 unset HISTFILE直接取消歷史記錄功能,這對服務器的平常維護來講是十分危險的。

文件操做

在退出終端時bash會自動將當前會話中執行過的命令寫入歷史記錄文件中,默認寫入方式爲覆蓋。你也能夠經過-w-a模式將當前會話中的命令手動寫入文件中:spa

> history -w  # 緩衝隊列覆蓋寫入文件
> history -a  # 當前會話的命令追加寫入文件

高級設置

Ubuntu 20.04 LTS爲例,默認狀況下歷史記錄相關的環境變量被定義在~/.bashrc文件中。code

添加時間戳

經過修改HISTTIMEFORMAT變量能夠對歷史記錄添加時間戳,%F表明日期,%T表明時間。orm

> export HISTTIMEFORMAT='%F %T '
> echo 'history with time'
> history 1
1032  2020-02-23 17:01:26 history

修改記錄策略

經過修改HISTCONTROL變量能夠控制history的記錄策略,以下表所示:隊列

可選值 記錄策略
ignoredups 默認,不記錄連續的相同命令
ignorespace 不記錄空格開頭的命令
ignoreboth ignoredups 和 ignorespace 的組合
erasedups 不記錄重複的命令

咱們還能夠經過設置HISTIGNORE變量指定要忽略的命令,命令之間用:分隔:

> echo 'export HISTIGNORE="ls:cd"' >> ~/.bashrc
> source ~/.bashrc

修改存儲文件

當前用戶的歷史記錄默認存儲到~/.bash_history文件中,能夠經過修改HISTFILE變量改變歷史記錄存儲的位置。

> echo 'export HISTFILE="<new_histfile_path>"' >> ~/.bashrc
> source ~/.bashrc

修改存儲大小

變量HISTSIZE決定了使用history顯示的記錄數量,其默認值爲1000

> echo $HISTSIZE
1000
> HISTSIZE=200 # 僅針對當前會話生效
> sed -i 's/^HISTSIZE=1000/HISTSIZE=200/' ~/.bashrc # 永久生效
> echo $HISTSIZE
200

變量HISTFILESIZE定義了存儲在文件中的歷史命令總數,默認值爲2000。歷史記錄的存儲方式相似於隊列,bash初始化時會將HISTFILE文件中存儲的全部歷史記錄加載到內存中,以隊列的形式存儲,用戶在使用過程當中產生的命令也會被添加到隊列中,每次用戶調用history都會顯示最近的HISTSIZE條記錄。

修改存儲策略

在終端退出時會將當前會話(session)中產生的記錄寫入到文件中,爲了防止同時開啓多個終端致使歷史記錄丟失,建議在~/.bashrc文件中添加shopt -s histappend,讓終端在退出時將當前會話產生的歷史記錄追加寫入到HISTFILE文件中。

[warning] 注意:默認狀況下的歷史記錄寫入方式爲覆蓋,例如:開啓終端A -> 開啓終端B -> 關閉終端A -> 關閉終端B,這個操做序列會致使終端A在運行過程當中產生的歷史記錄所有丟失。

斷電、非法關機等特殊狀況會讓bash沒法正常結束,進而致使當前會話的歷史記錄丟失。能夠在~/.bashrc文件中添加如下內容實現自動追加寫入每條命令:

PROMPT_COMMAND=」history -a」

bash的配置文件中,若是設置了PROMPT_COMMAND環境變量,則在每次顯示命令提示符(例如:remilia@CT7GK:~$)以前,該變量的值將被做爲命令執行,這裏咱們設置爲自動執行執行history -a,將歷史記錄追加寫入到文件中。