history 不只是列出曾執行過的指令,更是命令列生產力倍增器:快速重複、參數復用、搜尋過濾、審計追蹤、多終端同步。本文系統整理 15 大進階用法、環境變數調教、多 Shell 同步策略與審計最佳實踐。
| 變數 | 預設 | 建議值 | 作用 |
|---|---|---|---|
HISTSIZE | 500/1000 | 5000-10000 | 記憶體中保留命令條數 |
HISTFILESIZE | 同 HISTSIZE | 10000-20000 | 歷史檔案最大行數 |
HISTFILE | ~/.bash_history | ~/.bash_history | 歷史檔案路徑 |
HISTTIMEFORMAT | 無 | '%F %T ' | 顯示時間戳(需 Bash 3.0+) |
HISTCONTROL | 無 | ignoredups:erasedups | 忽略連續重複/全域去重 |
HISTIGNORE | 無 | "ls:ll:pwd:exit:history*" | 不記錄指定指令 |
HISTCMD | — | 只讀 | 當前命令歷史編號 |
~/.bashrc
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTTIMEFORMAT='%F %T '
export HISTCONTROL=ignoredups:erasedups
export HISTIGNORE="ls:ll:pwd:exit:history*:clear"
# 多終端即時同步(可選)
shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
history | tail -20
# 輸出: 1001 2024-03-05 14:30:00 systemctl restart nginx
!! + Enter!-1 + Enter
!1001 # 執行第 1001 條
!-5 # 執行倒數第 5 條
!ssh # 執行最近以 ssh 開頭的指令
!?conf # 執行最近包含 conf 的指令
見 HISTSIZE/HISTFILESIZE 設定。
export HISTFILE=~/.my_history
# 方便備份/同步/審計
export HISTCONTROL=ignoredups
# 連續三次 pwd 只記錄一條
export HISTCONTROL=erasedups
# 歷史中只保留每條指令最新一次
export HISTCONTROL=ignorespace
# 執行時:secret_command → 不進歷史
history -c # 清除記憶體歷史
history -w # 寫入檔案(覆蓋)
# 組合:history -c && history -w
ls /very/long/path/to/file.txt
vi !!:$ # vi /very/long/path/to/file.txt
vi !^ # vi /very/long/path/to/file.txt (第一個參數)
cp !!:1 !!:2 # 複製第1、2參數
echo /path/to/file.txt
vi !$:h # vi /path/to/ (目錄部分)
vi !$:t # vi file.txt (檔名部分)
vi !$:r # vi /path/to/file (去副檔名)
vi !$:e # vi txt (副檔名)
export HISTSIZE=0
# 或
set +o history # 當前 Shell 暫停記錄
set -o history # 恢復記錄
export HISTIGNORE="ls:ll:pwd:exit:history*:clear:cd:cd -"
# 這些指令不進歷史,保持歷史乾淨
# ~/.bashrc 末尾加入
shopt -s histappend # 追加而非覆蓋
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
# -a 追加當前 session 新增歷史到檔案
# -c 清除記憶體歷史
# -r 從檔案重讀歷史到記憶體
# 效果:開新終端即可看到舊終端剛執行的指令
HISTFILE 導向共享儲存或透過 syslog/auditd 記錄。chattr +a ~/.bash_history(僅允許追加)、定期備份異地存檔。HISTIGNORE 排除含密碼/Token 的指令,或改用環境變數/密碼管理器傳遞秘鑰。HISTTIMEFORMAT 確保審計時間線完整。history 的核心價值在於「以最小認知負荷復用過往操作」。配置 HISTTIMEFORMAT、HISTCONTROL=ignoredups:erasedups、HISTIGNORE、PROMPT_COMMAND 同步四大鐵律,善用 Ctrl+R、!!:$、!^、!$:h 等展開語法,即可將命令列效率提升 50% 以上。