Linux history参数有哪些隐藏技巧?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 参数 正文

下面我将从 基本用法、常用参数、高级技巧 三个方面详细解释 history 命令的参数和功能。

linux history参数
(图片来源网络,侵删)

基本用法(无参数)

在不带任何参数的情况下,history 命令会显示当前 Shell 会话中所有执行过的命令列表,每条命令前带有一个数字序号。

history

示例输出:

    1  ls -l
    2  cd /tmp
    3  pwd
    4  whoami
    5  date
    6  history

常用参数详解

history 命令支持多种参数,可以灵活地控制其输出和行为。

-c (clear)

功能清空整个命令历史记录列表,这是一个危险操作,执行后当前会话的历史记录将全部丢失。

linux history参数
(图片来源网络,侵删)
history -c

注意:这只会清空当前 Shell 进程的历史记录,如果历史记录已经被写入到历史文件(通常是 ~/.bash_history),那么下次登录时,历史记录会从文件中重新加载。

-d <行号> (delete)

功能删除历史记录中指定行号的命令。

# 删除历史记录中的第 10 行命令
history -d 10

进阶用法:删除一个连续的命令范围。

# 删除从第 10 行到第 20 行的所有命令
history -d 10 20

注意:删除某一行后,后续所有命令的行号会自动向前补齐。

-n <文件名> (read)

功能读取指定文件中的内容,并将其追加到当前的历史记录列表中,但不写入历史文件。

# 从 my_commands.txt 文件中读取历史记录到当前会话
history -n my_commands.txt

这个参数在日常使用中不常见,但在脚本处理时可能有用。

-r <文件名> (read)

功能读取指定文件的内容,并将其替换当前的历史记录列表。

# 用 my_commands.txt 的内容替换当前会话的历史记录
history -r my_commands.txt

同样,这个参数也较少在交互式 Shell 中使用。

-w <文件名> (write)

功能写入当前会话的历史记录到指定的文件中,如果文件不存在,会创建新文件;如果文件已存在,会覆盖原有内容。

# 将当前历史记录写入到 my_history.log 文件
history -w my_history.log

如果不带 <文件名>history -w 会将当前历史记录写入到默认的历史文件(通常是 ~/.bash_history),这是保存当前会话历史记录的常用方法。

-p <命令> (print)

功能打印指定的命令,但不将其添加到历史记录中,也不执行它,这对于测试和查看将要执行的命令非常有用。

# 打印 "echo hello world",但不会执行它,也不会记录
history -p "echo hello world"

输出:

echo hello world

-s <命令> (substitute)

功能添加指定的命令到历史记录列表中,但不立即执行它。

# 将 "ls -la" 添加到历史记录,但不执行
history -s "ls -la"

之后,你可以通过按上下箭头键找到并执行这条命令。

-a (append)

功能追加当前会话中所有新执行的命令到历史文件(~/.bash_history)中,即使你退出了 Shell,新执行的命令也会被保存。

# 追加当前历史到历史文件
history -a

Shell 在退出时会自动执行此操作,但手动执行可以确保在 Shell 未退出时也保存历史。

-n (new)

功能读取历史文件中所有未被当前 Shell 会话读取的行,并将其添加到当前历史记录中,这个操作也是 Shell 启动时自动完成的。

# 读取历史文件中的新行到当前会话
history -n

-N (new lines)

功能:与 -n 类似,但它会读取整个历史文件,而不仅仅是新的行。

-P (perform)

功能执行指定的命令,并将其输出添加到历史记录中,但命令本身被记录。

# 执行 "echo hello",并将 "hello" 这个输出添加到历史记录
# 注意:这行为比较特殊,不常用
history -P "echo hello"

-R (read and perform)

功能:从标准输入读取一行,将其作为命令执行,并将其输出添加到历史记录,但命令本身被记录。


高级技巧与组合用法

除了单个参数,history 常常与其他命令结合使用,发挥其最大威力。

限制显示的历史记录数量

使用 history 后面直接跟一个数字,可以只显示最近的 N 条历史记录。

# 只显示最近 10 条历史记录
history 10

搜索历史记录

这是 history 最常用的功能之一。

  • Ctrl+R:反向搜索历史记录,按下 Ctrl+R 后,输入命令的一部分,Shell 会自动匹配并显示最近的一条匹配命令,再次按 Ctrl+R 可以继续向前查找。
  • (事件操作符)
    • 执行上一条命令。
    • !数字:执行历史记录中指定行号的命令。!5 会执行历史记录中的第 5 条命令。
    • !字符串:执行最近以 "字符串" 开头的命令。!ls 会执行最近一条以 ls 开头的命令。
    • !?字符串?:执行最近包含 "字符串" 的命令。!?date? 会执行最近一条包含 date 的命令。

控制历史记录的存储

这些通常是通过 Shell 的配置文件(如 ~/.bashrc, ~/.zshrc)来设置的,而不是 history 命令本身的参数。

  • HISTSIZE:当前 Shell 会话中能保存的历史记录条数。
    export HISTSIZE=10000
  • HISTFILESIZE:历史文件(~/.bash_history)中最多能保存的历史记录条数。
    export HISTFILESIZE=20000
  • HISTCONTROL:控制哪些命令被记录。
    • ignorespace:以空格开头的命令不记录。
    • ignoredups:与上一条重复的命令不记录。
    • ignoreboth:相当于 ignorespace:ignoredups 的组合。
      export HISTCONTROL=ignoreboth
  • HISTTIMEFORMAT:为历史记录添加时间戳,这是一个非常有用的设置!
    # 格式为:YYYY-MM-DD HH:MM:SS
    export HISTTIMEFORMAT="%F %T "

    设置后,history 的输出会带上执行时间:

    2025-10-27 10:30:15  ls -l
    2025-10-27 10:30:18  cd /tmp
    2025-10-27 10:30:22  pwd

禁止记录敏感命令

对于像 ssh, mysql -p, pass 等包含密码的命令,你肯定不希望它们被记录到历史文件中,一个简单的方法是在命令前加一个空格。

确保你的 HISTCONTROL 设置中包含 ignorespace

# 在 ~/.bashrc 中设置
export HISTCONTROL=ignorespace

然后执行命令时,在开头加一个空格:

# 这个命令不会被记录
 ssh user@server.com

总结表格

参数/用法 功能描述 示例
history 显示当前会话的所有历史记录 history
history N 显示最近的 N 条历史记录 history 20
history -c 清空当前会话的历史记录 history -c
history -d N 删除历史记录中的第 N 行 history -d 15
history -w 将当前历史记录写入默认历史文件 history -w
history -w file 将当前历史记录写入指定文件 history -w my_hist.log
history -a 将当前新历史记录追加到默认历史文件 history -a
history -p "cmd" 打印命令 cmd,但不执行或记录 history -p "ls -la"
history -s "cmd" 添加命令 cmd 到历史记录,但不执行 history -s "echo test"
执行上一条命令
!N 执行历史记录中的第 N 条命令 !42
!string 执行最近以 string 开头的命令 !ls
!?string? 执行最近包含 string 的命令 !?date?
Ctrl+R 反向搜索历史记录 Ctrl+R

希望这份详细的解释能帮助你全面掌握 Linux history 命令!

-- 展开阅读全文 --
头像
戴尔Inspiron 7459拆机步骤有哪些?
« 上一篇 今天
JBL GO Smart拆机有何亮点与不足?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]