Contents

Zsh設定開啟commmand紀錄

最近重裝 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 搜尋:

  1. Ctrl+R 進入搜尋模式
  2. 輸入關鍵字,Zsh 會顯示最近符合的指令
  3. 繼續按 Ctrl+R 往前搜尋更早的符合結果
  4. 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

參考資料