熟練使用 Bash 歷史展開(History Expansion)可大幅減少重複輸入,尤其在處理長路徑、多參數指令時效果顯著。本文整理最實用的展開語法與實例。
| 語法 | 說明 | 範例 |
|---|---|---|
!* | 上一條指令的所有參數 | vim a.txt b.txt → git add !* 等同 git add a.txt b.txt |
!$ | 上一條指令的最後一個參數 | mkdir /tmp/test → cd !$ 進入該目錄 |
Alt+. 或 Esc+. | 互動模式下自動補全最後一個參數 | 按下組合鍵即出現 /tmp/test |
!-: | 上一條指令除最後一參數外的所有內容(含指令本身) | tar -zcvf backup.tar.gz /home/user → !-: 取得 tar -zcvf backup.tar.gz |
Alt+數字+. | 取得上一條指令的第 N 個欄位(0 為指令本身) | ls -lh /etc → Alt+2+. 取得 -lh |
^舊^新^ | 替換上一條指令第一處「舊」為「新」並執行 | grep error /var/log/messages → ^error^warn^ 執行 grep warn /var/log/messages |
!!:gs/舊/新/ | 替換上一條指令所有「舊」為「新」並執行 | echo foo foo → !!:gs/foo/bar/ 執行 echo bar bar |
!! | 重複執行上一條完整指令 | 同上 |
!數字 | 執行 history 中編號為 數字 的指令 | !1024 |
$ vim main.c utils.c config.h
$ git add !*
$ git commit -m "update core modules"
$ gcc -Wall !* -o main
$ mkdir -p /var/www/project/{css,js,images}
$ cd !$ # 進入 images(最後一參數)
# 若要進入 project 根目錄:
$ cd !-: # 取得 mkdir -p /var/www/project/{css,js,images},再手動調整
$ systemctl status nginxd
# 發現服務名稱錯誤
$ ^nginxd^nginx^
# 自動執行 systemctl status nginx
$ for f in *.htm; do mv "$f" "${f%.htm}.html"; done
# 發現漏掉 .html 檔
$ !!:gs/.htm/.html/ # 將指令中所有 .htm 替換為 .html 並重跑
history | grep 關鍵字 快速尋找歷史指令編號,再用 !編號 執行。set -o vi 或 set -o emacs 開啟命令列編輯模式,配合 Ctrl+R 反向搜尋歷史。HISTCONTROL=ignoredups:erasedups 避免重複紀錄;HISTSIZE=10000 增加記錄條數。熟練這幾組展開語法,終端機操作速度可提升 30% 以上,且減少拼字錯誤。建議先從 !$、!!、^old^new^ 開始練習,融入日常工作流。