Linux中如何快速调用刚执行过的命令?

在Linux命令行操作中,经常需要重复执行或引用刚执行的命令,无论是为了提高效率还是调试问题,熟练掌握命令历史调用技巧都非常重要,Linux的Shell(如Bash、Zsh等)提供了丰富的命令历史管理功能,通过内置的快捷方式、变量和工具,可以灵活调用历史命令。

linux中如何调用刚执行的命令

基础快捷方式:快速重复与引用

最常用的历史命令调用方式是通过“!”符号结合特定参数,直接引用或修改执行过的命令,这些快捷方式无需额外配置,在大多数Shell中默认可用。

重复执行上一条命令(!!)

最简单的场景是重复执行上一条命令,直接使用即可,执行ls -l后,若再次查看当前目录详细列表,只需输入并回车,Shell会自动替换为上一条完整的命令并执行。
示例

$ echo "Hello World"  # 执行后输出Hello World
$ !!                  # 自动执行echo "Hello World"

执行历史命令中的第n条(!n)

若要执行历史列表中编号为n的命令,可通过!n实现,历史编号可通过history命令查看(默认从1开始递增)。history显示第5条命令是pwd,则输入!5会直接执行pwd
示例

$ history            # 查看历史命令列表,假设第3条是cd /tmp
$ !3                 # 执行cd /tmp

执行倒数第n条命令(!-n)

除了正数编号,还可通过!-n引用倒数第n条命令。!-1等同于,!-2执行倒数第二条命令,这种方式在历史列表较长时比逐个查找编号更高效。
示例

$ date               # 倒数第一条
$ whoami             # 倒数第二条
$ !-2                # 执行whoami

通过字符串匹配执行命令(!string)

若记得命令中的部分关键字,可通过!string匹配最近一条包含该字符串的命令并执行,最近执行过grep "error" log.txt,则输入!grep会自动匹配并执行该命令。
示例

$ systemctl status nginx  # 假设这是最近包含"systemctl"的命令
$ !systemctl              # 执行systemctl status nginx

引用命令的参数(!$、!*)

有时需要重复使用上一条命令的参数,而非整个命令,引用最后一个参数,引用所有参数(用空格分隔),执行cp file1.txt /backup/后,若要将file2.txt也复制到同一目录,只需输入cp file2.txt !$,会被替换为/backup/
示例

linux中如何调用刚执行的命令

$ mv old_name.txt new_name.txt  # 移动文件
$ cp !$ backup/                 # 复制new_name.txt到backup/目录,!$=new_name.txt
$ rm !*                         # 删除上一条命令的所有参数(new_name.txt backup/)

历史命令管理工具:history与fc

除了快捷方式,Linux还提供了historyfc(fix command)两个工具,用于查看、编辑和执行历史命令。

history命令:查看与管理历史列表

history默认显示当前Shell会话中执行过的命令列表(带编号),常用选项包括:

  • -c:清空历史列表(仅当前会话)。
  • -w:将当前会话的历史写入历史文件(默认为~/.bash_history)。
  • -n:从历史文件中读取未读取的命令(追加到当前会话)。
    示例

    $ history 10          # 显示最近10条历史命令
    $ history -w          # 将当前会话历史保存到~/.bash_history

fc命令:编辑并执行历史命令

fc(Fix Command)允许以交互方式编辑历史命令后执行,语法为fc [选项] [旧命令编号] [新命令编号],常用选项:

  • -e:指定编辑器(如-e vi用vi编辑,-e nano用nano编辑)。
  • -l:仅列出历史命令,不执行(类似history)。
  • -s:直接执行指定编号的历史命令,不编辑。
    示例

    $ fc -e vi 5 10      # 用vi编辑第5到10条历史命令,保存后执行
    $ fc -s 8            # 直接执行第8条历史命令

历史命令的配置与持久化

通过Shell变量可调整历史命令的行为,这些变量通常定义在~/.bashrc(Bash)或~/.zshrc(Zsh)中,修改后需执行source ~/.bashrc生效。

常用配置变量

变量名 功能描述 默认值
HISTSIZE 内存中保存的历史命令数量(会话结束后写入历史文件) 500
HISTFILESIZE 历史文件(如~/.bash_history)的最大行数 5000
HISTCONTROL 控制历史命令的记录方式(ignoredups忽略重复命令,ignorespace忽略以空格开头的命令,ignoreboth两者都忽略)
HISTTIMEFORMAT 历史命令的时间戳格式(如"%Y-%m-%d %H:%M:%S "会在每条命令前显示时间)

示例配置(在~/.bashrc中添加):

export HISTSIZE=10000          # 内存保存10000条历史
export HISTFILESIZE=20000       # 历史文件保存20000条
export HISTCONTROL=ignoreboth  # 忽略重复和空格开头的命令
export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] "  # 显示时间戳

高级技巧:反向搜索与多Shell同步

Ctrl+R:反向搜索历史命令

在命令行按Ctrl+R后,输入关键词,Shell会实时反向搜索历史命令(从最新到最旧),再次按Ctrl+R继续向上搜索,找到后按回车执行,按Esc可复制到命令行编辑。
示例

linux中如何调用刚执行的命令

$ (按Ctrl+R)reverse-i-search:`': `grep`  # 输入grep,自动匹配最近的grep命令

多Shell会话同步历史

默认情况下,不同Shell会话的历史文件是独立的,退出会话后才会写入历史文件,若需实时同步,可在~/.bashrc中添加:

shopt -s histappend  # 追加历史,而非覆盖
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"  # 每次命令后立即保存历史

相关问答FAQs

Q1: 为什么有时执行提示“command not found”?
A: 通常是因为HISTCONTROL设置为ignorespaceignoreboth,且上一条命令以空格开头(Shell会忽略以空格开头的命令,不记录到历史),检查echo $HISTCONTROL,若包含ignorespace,需避免命令前加空格,或修改HISTCONTROLignoredups

Q2: 如何让Linux永久保存命令历史,即使重启后仍能查看?
A: 默认情况下,历史命令保存在~/.bash_history(Bash)或~/.zsh_history(Zsh)文件中,确保HISTFILESIZE变量设置足够大(如export HISTFILESIZE=100000),并在~/.bashrc中添加shopt -s histappend(避免历史被覆盖),重启后,历史文件会自动加载,可通过history查看历史记录。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/19451.html

(0)
酷番叔酷番叔
上一篇 2小时前
下一篇 2小时前

相关推荐

  • linux下如何修改文件夹权限

    Linux下修改文件夹权限是系统管理中的基础操作,涉及用户、用户组对文件或目录的访问控制权限,包括读(r)、写(w)、执行(x)三种基本权限,正确设置权限既能保障系统安全,又能满足协作需求,下面从基础概念到实操方法详细说明,Linux权限基础概念Linux权限分为三组:文件所有者(User,u)、所属用户组(G……

    2025年8月22日
    700
  • 如何在Linux系统中为火狐浏览器安装插件?

    在Linux操作系统中,火狐浏览器(Firefox)作为一款开源、跨平台的网页浏览器,凭借其强大的扩展性(通过插件/扩展功能)深受用户喜爱,插件能够帮助用户定制浏览体验、提升工作效率、增强安全性,例如广告拦截、密码管理、开发者工具等,本文将详细介绍在Linux系统下为火狐浏览器安装插件的多种方法,包括官方扩展商……

    2天前
    400
  • 如何快速查看电脑/手机默认网关?

    在Linux系统中,删除默认网关是网络配置调整的常见操作,通常用于切换网络环境、解决路由冲突或故障排除,以下是三种主流方法,操作前请务必注意:备份当前配置:执行 ip route show > ip_route_backup.txt 保存现有路由表权限要求:所有命令需 root 权限(前缀 sudo 或切……

    2025年7月14日
    2500
  • 为什么显示器刷新率是59.96Hz而非60Hz?

    图形界面设置(推荐新手)GNOME桌面(Ubuntu/Fedora等)步骤:设置 → 显示 → 在分辨率下拉菜单选择目标值(如1920×1080)→ 点击应用 → 确认弹窗提示(15秒内不确认自动还原),注意:若目标分辨率未列出,需先检查驱动或创建自定义分辨率,KDE Plasma(Kubuntu/KDE Ne……

    2025年7月25日
    1600
  • Linux下date命令如何快速取整?

    取整到分钟(去掉秒)场景:将当前时间精确到分钟(如 2023-10-05 14:30:00 → 2023-10-05 14:30)方法:date -d "@$(( $(date +%s) / 60 * 60 ))" "+%Y-%m-%d %H:%M"原理:date +%s……

    2025年6月25日
    2400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信