Ctrl + r输入关键词增量搜索历史命令,再按 Ctrl+r 翻上一条。
约 1275 字大约 4 分钟
2026-05-14
熟练的命令行使用者,敲的键并不比新手多多少——区别在于他们大量复用历史命令、用 Tab 补全代替记忆、用 alias 把高频长命令缩短。这篇讲怎么把这些效率工具用顺手,同时避开"为了方便反而误操作"的坑。
用 history 复用和回溯命令,用 alias 缩短高频操作,用 Tab 补全减少拼写错误,同时守住安全边界。
Ctrl + r输入关键词增量搜索历史命令,再按 Ctrl+r 翻上一条。
history | grep ssh在历史里找包含某关键词的命令,适合回溯“上次怎么做的”。
!!常见于 `sudo !!`——上条命令忘了加 sudo 时补救。
type ll看一个名字是 alias、函数、内建命令还是磁盘上的程序。
history 把你敲过的命令都记下来,价值有两个:
复用 —— 不用重敲。最高频的不是 history 本身,而是 Ctrl + r:按下后输入几个字符,Shell 就增量搜索匹配的历史命令,回车执行,或按方向键编辑。比 history | grep 再复制粘贴快得多。
几个常用的历史展开:
!! # 上一条命令,经典用法 sudo !!
!$ # 上一条命令的最后一个参数
!ssh # 最近一条以 ssh 开头的命令回溯 —— 排查问题时,"这台机器上次动过什么"往往是关键线索:
history | grep systemctl # 看最近对服务做过什么
history 1 | tail -50 # 看最近 50 条alias 给一串命令起个短名字,适合交互时的简单替换:
alias ll='ls -lah'
alias gs='git status'
alias ..='cd ..'要持久化就写进 ~/.bashrc 或 ~/.zshrc。但 alias 有明确的能力边界:
| alias 适合 | alias 不适合 |
|---|---|
| 固定的命令 + 选项缩写 | 需要参数、判断、循环的逻辑 |
| 交互时少敲几个字 | 写进脚本里(脚本默认不加载 alias) |
ll、gs 这种 | 复杂逻辑——那应该写成函数或独立脚本 |
需要处理参数就用函数,不要硬塞进 alias:
mkcd() { mkdir -p "$1" && cd "$1"; }敲命令时多按 Tab:补全命令名、文件路径、甚至(配了补全脚本的)子命令和选项。它的价值不只是少敲键,更是减少拼写错误——路径补不出来,往往说明你记错了目录或文件名,这本身就是一个信号。按两下 Tab 会列出所有候选。
当 ll 行为和预期不符,或者你不确定某个名字是 alias 还是真命令,用 type:
type ll
# ll is aliased to 'ls -lah'
type ls
# ls is /bin/ls
type cd
# cd is a shell builtintype 能区分 alias、函数、Shell 内建命令、磁盘上的程序——比 which(只查磁盘上的程序)信息更全。临时绕过 alias 用反斜杠:\ls 执行的是原始的 ls。
别用 alias 削弱安全提示
有人会写 alias rm='rm -f' 图省事,这非常危险——它去掉了所有确认。同理 alias rm='rm -i'(强制交互)看似安全,但你会习惯它的保护,某天在没有这个 alias 的机器上(或脚本里)就翻车。更稳的做法:不给危险命令做 alias,保持它原本的行为,靠习惯而不是靠 alias 来谨慎。history 里也可能留有密码、token,分享终端记录前先 history | grep 检查。
| 误区 | 更稳妥的做法 |
|---|---|
| 把带逻辑、要参数的命令塞进 alias | 用 Shell 函数或独立脚本,alias 只做静态替换 |
| 在脚本里依赖自己定义的 alias | 脚本默认不加载交互配置;脚本里用完整命令或函数 |
alias rm='rm -f' 之类削弱安全的 alias | 保持危险命令原样,别让"方便"盖过"确认" |
| 分享 history 不检查 | history 可能含密钥、密码,分享前先过滤 |
版权归属:Shuo Liu