history
命令是 Unix 系统中用于查看用户之前执行过的命令记录的实用工具,它允许用户回顾和重复使用之前输入的命令,极大提高了工作效率,这个命令在大多数 Unix-like 系统(包括 Linux 和 macOS)中都是默认可用的,它记录了用户在终端中输入的所有命令,形成了一个可查询的历史数据库,通过这个命令,用户不仅可以简单地回顾过去,还可以进行复杂的搜索、编辑和重用,甚至可以定制历史记录的行为。

历史命令的基本用法
在没有任何参数的情况下,直接输入 history
命令,它会列出当前用户在本次登录会话以及之前会话中保存在历史文件中的所有命令,默认情况下,每条命令都会被分配一个序号,这个序号是其在历史列表中的位置标识,一个简单的输出可能如下所示:
1 ls -l
2 cd Documents/
3 vim report.txt
4 gcc program.c -o program
5 ./program
这个列表直观地展示了用户最近的活动,最基本的功能是回顾,但它的真正力量在于其背后的可编程性和灵活性。
历史命令的扩展用法
history
命令的真正价值体现在其各种参数和与环境变量的结合使用上,用户可以通过多种方式与历史记录进行交互。
使用序号重复执行命令
这是最常用的功能之一,用户可以使用感叹号()后跟命令的序号来快速重新执行历史中的某条命令,要重新执行上面列表中的第4条命令(gcc program.c -o program
),用户只需输入:

!4
系统会立即展开并执行这条命令。 可以用来重复执行上一条命令,这在调试或需要连续运行相同命令时非常有用,如果用户忘记使用 sudo
执行了一条需要特权的命令,他们可以简单地输入 sudo !!
来用 sudo
重新执行上一条命令。
搜索历史记录
用户可以使用文本搜索来找到包含特定字符串的命令,最常见的方式是使用 Ctrl+R
组合键,按下 Ctrl+R
后,bash 会进入一个反向搜索模式,用户可以输入命令的任何部分,系统会实时显示匹配的最新命令,如果找到的不是想要的,可以继续按 Ctrl+R
查找更早的匹配项,找到后按回车即可执行。
另一种方式是使用 后跟字符串,!gcc
会执行历史中最近一条以 gcc
开头的命令,同样,!?string?
会执行最近一条包含 string
的命令。
使用参数和选项
history
命令本身也接受一些参数来控制其输出。

参数 | 描述 | 示例 |
---|---|---|
-c |
清空当前历史列表,这只会删除内存中的列表,不会删除文件。 | history -c |
-d offset |
删除指定序号的历史条目。 | history -d 5 |
-a |
将当前会话的新历史追加到历史文件中。 | history -a |
-n |
读取尚未读过的历史文件行。 | history -n |
-r |
读取历史文件,并追加到当前列表。 | history -r |
-w |
覆盖写入历史文件。 | history -w |
环境变量的定制
history
命令的行为可以通过一系列环境变量进行深度定制,这使得它能够适应不同用户的工作流程。
- HISTSIZE: 这个变量定义了内存中保存的历史记录数量,默认通常是500或1000,设置为
HISTSIZE=10000
可以让用户在当前会话中记住更多的命令。 - HISTFILESIZE: 这个变量定义了保存在历史文件(通常是
~/.bash_history
)中的最大记录数,当用户注销时,内存中的历史记录会写入这个文件。HISTFILESIZE
小于HISTSIZE
,一些记录可能会在注销时丢失。 - HISTFILE: 这个变量可以改变历史文件的默认路径,设置
HISTFILE=~/.my_custom_history
可以让历史记录保存在一个自定义的位置。 - HISTCONTROL: 这是一个非常重要的变量,它控制哪些命令会被记录,它可以设置为以下值的组合:
ignorespace
: 不记录以空格开头的命令,这对于执行一些不想被记录的临时或敏感命令非常有用,只需在命令前加一个空格即可。ignoredups
: 不记录与前一条完全相同的连续命令,这可以防止历史记录被大量重复的命令(如ls
或pwd
)所污染。ignoreboth
: 这是ignorespace
和ignoredups
的缩写,是很多系统上的默认值。erasedups
: 在将新命令加入历史列表之前,删除所有与它相同的旧命令,确保历史列表中每条命令都是唯一的。
- HISTTIMEFORMAT: 如果设置了此变量,
history
命令会在每条命令前显示其执行的时间戳,设置HISTTIMEFORMAT="%F %T "
后,历史记录会显示为:1 2023-10-27 14:30:15 ls -l 2 2023-10-27 14:30:20 cd Documents/
安全与隐私考量
虽然 history
命令非常强大,但它也带来了安全和隐私问题,历史文件是明文存储的,任何能访问用户主目录的人都能看到用户执行过的所有命令,包括密码、API密钥等敏感信息(如果用户不小心将它们作为命令参数输入),对于多用户系统或服务器环境,管理员和用户都应该意识到这一点,使用 HISTCONTROL=ignorespace
是一个好习惯,可以防止敏感信息被记录,对于关键系统,甚至可以考虑完全禁用历史记录或将其指向 /dev/null
。
history
命令远不止是一个简单的“回忆”工具,它是一个高度可定制的、与 shell 深度集成的效率放大器,从简单的 到复杂的 HISTCONTROL
和 HISTTIMEFORMAT
设置,它为从初学者到资深系统管理员的各类用户提供了从基础到高级的各种功能,通过熟练掌握 history
,用户可以显著减少重复输入,加快工作流程,并更有效地管理和审计自己的 shell 活动,真正体现了 Unix 设计哲学中“让工具做好一件事,并把它做到极致”的思想。
相关问答FAQs
问题1:如何防止我的历史记录中保存某些特定的敏感命令?
解答: 你有几种方法可以做到这一点,最简单直接的方法是在命令前面加一个空格,如果你的 shell(如 bash)的环境变量 HISTCONTROL
设置为包含 ignorespace
(或者 ignoreboth
),那么任何以空格开头的命令都不会被保存到历史记录中,如果你想执行 mysql -u root -p'password123'
但不希望它被记录,你可以输入 mysql -u root -p'password123'
(注意命令前有一个空格),这是一种快速、临时的方法,无需修改任何配置文件,如果你希望永久性地不记录某些类型的命令,你可能需要编写更复杂的 shell 函数或使用 trap
命令来拦截特定的命令模式。
问题2:我的 history
命令只显示了最近的一些命令,但我知道我之前执行过更多命令,为什么我看不到更早的记录?
解答: 这通常是由 HISTSIZE
和 HISTFILESIZE
这两个环境变量控制的。HISTSIZE
定义了你的当前 shell 会话在内存中能记住的命令数量,而 HISTFILESIZE
定义了当你注销时,有多少命令会被永久保存到你的历史文件(通常是 ~/.bash_history
)中,如果你的 HISTSIZE
被设置得比较小(比如是默认的500),你就只能看到最近的500条命令,同样,如果你的 HISTFILESIZE
也很小,那么当你下次登录时,也只有这么多条记录会从文件中被加载回来,要解决这个问题,你可以在你的 shell 配置文件(如 ~/.bashrc
或 ~/.bash_profile
)中增加这两个变量的值,添加以下两行可以让你记住更多的命令:
export HISTSIZE=10000 export HISTFILESIZE=20000
这样,你的 shell 会话可以记住更多的命令,并且在注销时也能将更多的命令保存到文件中,从而在下次登录时提供更长的历史记录。