目錄導航:超越 cd
目錄棧:pushd/popd/dirs
Bash 內建目錄棧,支援多目錄快速切換:
# 入棧並切換
pushd /var/log
pushd /etc/nginx
pushd /home/user/projects
# 查看棧(頂部在左)
dirs -v
# 0 /home/user/projects
# 1 /etc/nginx
# 2 /var/log
# 3 ~
# 按索引切換
pushd +1 # 切換到 /etc/nginx (索引 1)
pushd -0 # 切換到棧底 ~
# 出棧並切換
popd # 移除頂部,切換到下一個
popd +1 # 移除索引 1
自動化目錄棧(.bashrc)
# 自動記錄目錄歷史
DIRSTACKSIZE=20
setopt autopushd pushdminus pushdsilent pushdtohome 2>/dev/null || true # zsh
# Bash 兼容寫法:
alias cd='pushd'
alias bd='popd'
alias d='dirs -v'
cd - 與 CDPATH
# 返回上一目錄
cd -
# 設置搜索路徑(如 CDPATH=.:~:/projects)
export CDPATH=".:~:/var/www:/opt"
cd logs # 依次嘗試 ./logs, ~/logs, /var/www/logs, /opt/logs
鍵盤快捷鍵速查表(Readline/Emacs 模式)
| 快捷鍵 | 動作 | 記憶口訣 |
| Ctrl+A | 移至行首 | Start |
| Ctrl+E | 移至行尾 | End |
| Alt+B | 向後移一詞 | Backward |
| Alt+F | 向前移一詞 | Forward |
| Ctrl+U | 剪切光標前至行首 | Uncut/Kill line |
| Ctrl+K | 剪切光標後至行尾 | Kill |
| Ctrl+W | 剪切前一詞 | Word |
| Ctrl+Y | 粘貼剪切內容 | Yank |
| Alt+Y | 循環粘貼歷史剪切 | Yank pop |
| Ctrl+L | 清屏(保留當前行) | Clear |
| Ctrl+C | 發送 SIGINT 終止命令 | Cancel |
| Ctrl+D | EOF / 退出 Shell | Done |
| Ctrl+R | 反向歷史搜索 | Reverse search |
| Ctrl+S | 正向歷史搜索 (需 stty -ixon) | Search |
| Ctrl+G | 退出搜索模式 | Go away |
| Ctrl+T | 交換光標前兩字符 | Transpose |
| Alt+T | 交換光標前兩詞 | Transpose word |
| Alt+. | 插入上條命令最後參數 | 同 !$ |
| Alt+数字 | 參數數字參數 | Alt+2 → 2nd arg |
歷史命令高效用法
配置優化
# ~/.bashrc
export HISTSIZE=50000
export HISTFILESIZE=100000
export HISTCONTROL=ignoreboth:erasedups # 忽略空格開頭+去重
export HISTTIMEFORMAT='%F %T '
export HISTIGNORE="ls:ll:cd:pwd:clear:history:exit"
shopt -s histappend cmdhist lithist
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
歷史搜索三板斧
- Ctrl+R 互動搜索:輸入關鍵字,回車執行,左右鍵編輯
- ! 事件指示符:
!vim、!-2、!?conf?
- history | grep:
history | grep docker | tail -5
歷史展開修飾符
# 最後參數
echo foo bar baz
vim !$ # vim baz
# 所有參數
cp file1 file2 /dest
mv !* /newdest # mv file1 file2 /dest /newdest
# 字符串替換
^old^new # 首個
!!:gs/old/new # 全局
# 路徑操作
:h 目錄部分 /path/to/file → /path/to
:t 文件名 /path/to/file → file
:r 去擴展名 file.txt → file
:e 只取擴展名 file.txt → txt
Tab 自動補全進階
可編程補全 (bash-completion)
# 安裝
dnf install bash-completion -y
apt install bash-completion -y
# 載入 (通常自動)
source /usr/share/bash-completion/bash_completion
自定義補全範例
# 為自定義腳本添加補全
_myscript() {
local cur=${COMP_WORDS[COMP_CWORD]}
local opts="start stop restart status deploy"
COMPREPLY=( $(compgen -W "$opts" -- $cur) )
}
complete -F _myscript myscript
# 文件類型補全
complete -f -X '!*.txt' mycat # 只補全 .txt
補全技巧
- Tab 單次:唯一補全或列出候選
- TabTab 雙擊:顯示所有候選
- Alt+?:顯示候選列表(同雙擊 Tab)
- Alt+/:嘗試文件名補全
- Alt+~:嘗試用戶名補全
- Alt+@:嘗試主機名補全(需 /etc/hosts 或 SSH config)
- Alt+$:嘗試變量名補全
- Alt+!:嘗試命令名補全
命令行編輯模式:Vi 模式
# 啟用
set -o vi
# 模式切換
# Esc → 正常模式 (hjkl 移動, x 刪除, dw 刪詞, dd 刪行, i/a 進入插入)
# i/a → 插入模式
# 正常模式常用
0 行首
$ 行尾
b/w 後退/前進一詞
cw 改詞
cc 改行
p/P 粘貼
u 撤銷
/string 向後搜索歷史
?string 向前搜索歷史
n/N 下一個/上一個
實戰工作流範例
場景:多目錄項目開發
# 1. 啟動會話,建立棧
pushd ~/projects/backend
pushd ~/projects/frontend
pushd ~/projects/infra
# 2. 快速切換
d # 列出棧
pushd +1 # 切到 frontend
pushd +0 # 切到 infra
# 3. 歷史複用
Ctrl+R docker # 搜索 docker 命令
Alt+. # 插入上條最後參數 (容器名)
Ctrl+A # 跳行首加 sudo
Ctrl+E # 跳行尾加 &
# 4. 參數複用
tar -czf backup.tar.gz src/ config/ docs/
scp !$ server:/backup/ # 復用所有參數
場景:日誌分析管道構建
# 逐步構建管道,每步驗證
tail -f /var/log/nginx/access.log
# Ctrl+C
!! | grep 500
# Ctrl+C
!! | awk '{print $1}' | sort | uniq -c | sort -rn
# Ctrl+C
!! | head -20
效率工具推薦
| 工具 | 作用 | 安裝 |
| fzf | 模糊搜索歷史/文件/進程 | dnf/apt install fzf |
| zoxide | 智能目錄跳轉 (z 代替 cd) | curl -sS https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | bash |
| atuin | SQLite 存儲歷史+同步+統計 | cargo install atuin |
| mcfly | 神經網絡歷史搜索優先級 | cargo install mcfly |
| direnv | 目錄級環境變量自動載入 | dnf/apt install direnv |
總結
命令行效率 = 目錄棧 + 歷史搜索 + 快捷鍵肌肉記憶 + 智能補全 + 良好習慣。建議:
- 強制練習 Ctrl+R 替代 ↑ 翻歷史
- 配置
HISTCONTROL=erasedups 保持歷史乾淨
- 安裝 fzf 接管 Ctrl+R、Ctrl+T、Alt+C
- 嘗試 zoxide 替代手動 cd
- 將常用工作流封裝為函數/別名/腳本
copyright ©
萬盛學電腦網 all rights reserved