最近重裝 zsh 後發現沒有 history 查詢功能,登出後 history 就消失了,很不方便。
基本 History 設定
在 ~/.zshrc 中加入以下設定:
1
2
3
|
HISTSIZE=10000 # 記憶體中保留的 history 筆數
SAVEHIST=10000 # 儲存到檔案的 history 筆數
HISTFILE=~/.zsh_history # history 檔案位置
|
設定完成後執行 source ~/.zshrc 套用設定,或重新開啟終端機。
進階 setopt 設定
Zsh 提供許多 setopt 選項來控制 history 的行為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 多個終端視窗共享 history(任一視窗的指令立即對其他視窗可見)
setopt SHARE_HISTORY
# 立即將指令附加到 history 檔案(不等到 shell 關閉才寫入)
setopt INC_APPEND_HISTORY
# 儲存 history 時一併記錄時間戳
setopt EXTENDED_HISTORY
# 忽略連續重複的指令(不重複記錄)
setopt HIST_IGNORE_DUPS
# 忽略所有重複指令(即使不連續也不記錄)
setopt HIST_IGNORE_ALL_DUPS
# 指令前面加空格則不記錄到 history(適合輸入密碼時使用)
setopt HIST_IGNORE_SPACE
# 若新指令與 history 中現有的重複,刪除舊的再新增
setopt HIST_EXPIRE_DUPS_FIRST
# 搜尋 history 時不顯示重複的指令
setopt HIST_FIND_NO_DUPS
|
推薦的完整設定
1
2
3
4
5
6
7
8
9
10
11
12
|
# ~/.zshrc
HISTSIZE=10000
SAVEHIST=10000
HISTFILE=~/.zsh_history
setopt EXTENDED_HISTORY # 記錄時間戳
setopt SHARE_HISTORY # 跨終端視窗共享
setopt HIST_IGNORE_DUPS # 忽略連續重複
setopt HIST_IGNORE_SPACE # 空格開頭不記錄
setopt HIST_EXPIRE_DUPS_FIRST # 優先刪除重複的舊記錄
setopt HIST_FIND_NO_DUPS # 搜尋時不顯示重複
|
查詢 History 的方式
使用 history 指令
1
2
3
4
5
6
7
8
9
10
11
|
# 顯示最近 10 筆 history
history 10
# 顯示所有 history
history
# 搜尋包含特定關鍵字的指令
history | grep docker
# 搜尋並執行(直接加上管線)
history | grep "npm run" | tail -5
|
使用 Ctrl+R 互動式搜尋
在終端機中按 Ctrl+R 進入互動式 history 搜尋:
- 按
Ctrl+R 進入搜尋模式
- 輸入關鍵字,Zsh 會顯示最近符合的指令
- 繼續按
Ctrl+R 往前搜尋更早的符合結果
- 按
Enter 執行,或按 Ctrl+G 取消
如果有安裝 Oh My Zsh,可以安裝 fzf 外掛讓搜尋體驗更好:
1
2
3
4
5
|
# macOS
brew install fzf
# 設定 fzf 與 Zsh 整合(會修改 ~/.zshrc)
$(brew --prefix)/opt/fzf/install
|
安裝後 Ctrl+R 會開啟 fzf 互動式搜尋界面,可以模糊搜尋 history。
使用 ! 語法重複指令
1
2
3
4
|
!! # 重複上一條指令
!ssh # 重複最近一條以 ssh 開頭的指令
!-2 # 重複倒數第二條指令
!?docker? # 重複最近一條包含 docker 的指令
|
History 檔案位置($HISTFILE)
History 儲存的位置由 $HISTFILE 變數決定,預設通常是 ~/.zsh_history:
1
2
3
4
|
echo $HISTFILE # 查看目前的 history 檔案路徑
# 直接搜尋 history 檔案
grep "git commit" ~/.zsh_history
|
參考資料