!! 是 Bash、Zsh 等 shell 中重跑上一条命令的快捷方式,支持加前缀(如 sudo)、补参数(如 ls -a !!)或修正路径,但需在交互式 shell 中且上条命令已存入 history。

双感叹号 !! 是 Bash、Zsh 等主流 shell 中最直接的“重跑上一条命令”方式,特别适合处理权限不足、拼写遗漏等报错后快速补救的场景。
报错后加前缀重试(最常用)
当命令因权限问题失败时,不用重新输入整条命令,只需在前面加上 sudo、time、strace 等前缀,再接 !!:
$ apt update<br>Permission denied
→ 输入sudo !!,自动执行sudo apt update$ docker build .<br>permission denied
→ 输入sudo !!,等效于sudo docker build .$ make<br>command not found
→ 输入PATH=/usr/local/bin:$PATH !!,临时修正路径后重试
修正参数再执行
如果报错是因为少参数、错参数,可用 !! 配合历史扩展快速修改:
- 原命令:
ls /var/log(想看隐藏文件但漏了-a)→ 输入ls -a !!,展开为ls -a /var/log - 原命令:
curl http://example.com(没加-v调试)→ 输入curl -v !!,变成curl -v http://example.com - 原命令:
git commit -m "init"(忘了-a)→ 输入git commit -a !!,执行git commit -a -m "init"
注意生效前提和常见陷阱
!! 不是万能的,需满足几个基本条件才能正常工作:
- 必须在交互式 shell 中使用;脚本里默认不启用历史扩展,需手动开启
set -o histexpand - 上一条命令必须已成功记录进 history —— 如果上条是空行、仅含注释或以空格开头(被设为忽略),!! 可能调用不到
- 遇到语法错误(如
if [ 1 = 2; then echo ok缺少fi)时,该命令不会进入 history,此时 !! 会调用再上一条有效命令 - 部分特殊字符(如管道、重定向)在组合使用时需加引号或转义,例如
echo !! | grep foo中的|可能被提前解析,建议用echo "!!" | grep foo或分步操作
比方向键更高效的替代方案
除了 !!,还有几种配合使用的快捷方式,让报错后修复更顺滑:
-
!$:取上条命令最后一个参数,比如cp file.txt /tmp/报错后想ls /tmp/,直接输ls !$ -
!^:取第一个参数,适合复用路径或文件名 -
Ctrl+R:反向搜索历史,输入关键词(如apt或curl)快速定位最近相关命令,尤其适合报错命令已被多条新命令隔开的情况 -
fc:打开上条命令在编辑器中修改,适合复杂命令(如含多层嵌套、长 JSON 字符串)需要精细调整时

















