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

基本用法(无参数)
在不带任何参数的情况下,history 命令会显示当前 Shell 会话中所有执行过的命令列表,每条命令前带有一个数字序号。
history
示例输出:
1 ls -l
2 cd /tmp
3 pwd
4 whoami
5 date
6 history
常用参数详解
history 命令支持多种参数,可以灵活地控制其输出和行为。
-c (clear)
功能:清空整个命令历史记录列表,这是一个危险操作,执行后当前会话的历史记录将全部丢失。

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 命令!
