用 !!、!n 和 !string 可快速复用历史命令:!n 精准执行编号命令,保留所有特殊字符;!string 匹配开头关键字;!! 修正上条命令,配合 :s/old/new 等修饰符;fc 交互式编辑更复杂命令。

直接用 !! 或 !n 就能快速复用复杂长命令,不用重输、不靠上下箭头翻找,关键是选对调用方式。
用编号精准调用:!n 最稳当
长命令往往带变量、路径或特殊符号,手动输入极易出错。history 列出编号后,直接 !123(假设编号是 123)就能原样执行——包括 $(date +%Y%m%d)、嵌套引号、转义字符等全部保留。
- 先运行
history | tail -20查最近 20 条,或history 50看更多 - 若命令不在当前页,可用
history | grep -i "docker\|tar\|rsync"快速定位 - 编号随会话变化,但只要没清空 history 缓冲区,编号就可靠
按开头关键字调用:!string 最省记
记不清完整命令,但记得开头几个字?比如刚跑过 python3 train.py --epochs=50 --lr=0.001,下次只需输入 !py 或 !python3,Bash 就自动匹配并执行最近一条以该字符串开头的命令。
- 只匹配命令词(第一个单词),不匹配参数;
!git不会匹配vim git.log - 加
:p可预览不执行:!python3:p→ 屏幕显示命令,确认无误再回车 - 注意安全:避免在脚本或共享环境中盲目用
!rm类命令
快速修正再执行:!! 配合参数引用
执行完发现少个选项、权限不够或路径写错?不用整条重打。
- sudo !!:上条命令加 sudo,适合 apt、systemctl 等权限不足场景
-
!!:s/old/new:替换上条命令中第一个匹配项,如
echo "helo world"→!!:s/helo/hello - !$:p:打印上条命令最后一个参数,确认路径或文件名是否正确
- !^ 引用第一个参数,!:2 引用第二个(从 0 开始计数),适合批量操作时复用目标对象
交互式编辑:fc 更适合大改
如果长命令需要增删多个参数、调整逻辑顺序,或者涉及多行命令,fc 比历史扩展更直观。
- 输入
fc直接打开默认编辑器(通常是 vi),显示上一条命令,编辑保存即执行 - 想编辑特定编号的命令?
fc 142打开编号 142 的命令进行修改 - 编辑前可先用
history 140 145查看上下文,避免改错











