history 命令是几乎所有现代 Unix/Linux shell(包括 AIX 上的 KornShell - ksh)都内置的一个非常有用的功能,它用于记录、显示和管理用户在当前会话中执行过的命令历史。

基本用法
最简单的用法就是直接输入 history 命令。
history
这会显示当前会话中执行过的所有命令列表,每条命令前带有一个数字(历史记录编号)。
示例输出:
101 ls -l
102 cd /tmp
103 pwd
104 vi myscript.ksh
105 history
常用选项
history 命令本身有一些选项,但更强大的功能通常与 fc (fix command) 命令结合使用。

history -n
显示最近 n 条命令。
# 显示最近5条命令 history -5
示例输出:
106 ls -l /etc
107 ps -ef | grep root
108 df -h
109 history -5
110 history
history -c
清除当前会话的命令历史记录。
history -c history # 再执行,会发现列表为空
注意:这只会清除内存中的当前会话历史,不会清除历史文件。

history -r
从历史文件中读取命令,并将其添加到当前历史列表的末尾,这通常在启动一个新的 shell 时由系统自动完成。
核心功能:执行历史命令
history 命令真正的威力在于如何快速地重新执行或编辑之前的命令,这通常通过 、!n 和 !string 等事件指定符(Event Designators)来实现。
(双感叹号)
执行上一条命令。
# 假设你刚执行了一个很长的命令,但忘了加 sudo vi /etc/profile # 系统提示权限不足,你可以用 !! 快速重新执行并加上 sudo sudo !!
这会执行 sudo vi /etc/profile。
!n (感叹号 + 数字)
执行历史记录中编号为 n 的命令。
# 从 history 输出中找到命令编号 # 105 vi myscript.ksh # 重新执行第105条命令 !105
!string (感叹号 + 字符串)
执行历史记录中最近一个以 string 开头的命令。
# 假设你之前执行过 ps -ef # 现在想再次执行 !ps
这会执行 ps -ef。
!?string? (感叹号 + 问号 + 字符串 + 问号)
执行历史记录中最近一个包含 string 的命令。
# 假设你之前执行过 grep "error" /var/log/messages # 现在想再次执行 !?error?
这会执行 grep "error" /var/log/messages。
^old^new (插入符替换)
快速替换上一条命令中的 old 为 new 并执行。
# 假设你输错了目录 cd /usr/local/bin # 但你想去 /usr/local/sbin # 你可以不用重输整个命令,直接替换 ^local^local/sbin
这会执行 cd /usr/local/sbin。
(感叹号 + 美元符号)
使用上一条命令的最后一个参数。
# 假设你刚执行了一个命令,其参数是一个很长的路径 ls -l /very/long/path/to/a/specific/file.log # 现在你想用 `vim` 打开同一个文件 vim !$
这会执行 vim /very/long/path/to/a/specific/file.log。
配置历史记录
history 命令的行为由环境变量控制,你可以在用户的配置文件(通常是 ~/.profile 或 ~/.kshrc)中设置这些变量。
HISTSIZE / HISTFILESIZE
HISTSIZE: 定义了当前 shell 会话中可以保存多少条历史命令(内存中的历史记录数量)。HISTFILESIZE: 定义了历史文件(~/.sh_history)中可以保存多少条历史命令。
在 AIX 的 KornShell 中,这两个变量通常是同一个,在 ~/.profile 中设置:
# 设置历史记录文件大小为1000条 HISTSIZE=1000 export HISTSIZE
HISTFILE
指定历史记录文件的路径,默认通常是 ~/.sh_history。
# 在 ~/.profile 中设置 HISTFILE=/home/myuser/.my_history export HISTFILE
EDITOR
指定用于编辑历史命令的文本编辑器,当使用 fc 命令时,会调用这个编辑器。
# 在 ~/.profile 中设置 export EDITOR=vi
fc (Fix Command) 命令
fc 是 history 的一个互补命令,提供了更强大的编辑和执行历史命令的功能。
fc -l
列出历史记录,功能和 history 类似。
fc -l
fc -e vi
打开一个 vi 编辑器,里面包含了最近执行的一条命令,你可以修改它,然后保存退出,shell 就会执行编辑后的命令。
fc -e - old_command
重新编辑并执行 old_command。
# 假设你想修改并重新执行第105条命令 fc -e - 105
fc old new
编辑并执行从 old 到 new 编号之间的所有命令。
# 编辑并执行从 100 到 105 的所有命令 fc 100 105
持久化与安全
历史记录文件在哪里?
在 AIX 上,历史记录默认保存在用户主目录下的 .sh_history 文件中。
ls -la ~/.sh_history
安全注意事项
.sh_history 文件会记录你输入过的所有命令,包括可能包含密码、敏感信息或密钥的命令,需要注意:
- 文件权限:确保
.sh_history文件的权限设置正确,只有你本人可以读写。chmod 600 ~/.sh_history
- 敏感命令:尽量避免在命令行中直接输入密码,如果必须,可以在执行后立即从历史记录中删除。
# 执行了一个包含密码的命令后,从历史记录中删除它 history -d <历史记录编号>
- 清除历史:当你使用一个共享账户或在不安全的环境下操作时,在退出 shell 之前执行
history -c来清除内存中的历史记录,并可以考虑清空或删除历史文件。
| 功能/命令 | 描述 |
|---|---|
history |
显示所有历史命令 |
history -n |
显示最近 n 条命令 |
history -c |
清除当前会话历史 |
| 执行上一条命令 | |
!n |
执行编号为 n 的命令 |
!string |
执行最近以 string 开头的命令 |
!?string? |
执行最近包含 string 的命令 |
^old^new |
替换上一条命令中的 old 为 new 并执行 |
| 使用上一条命令的最后一个参数 | |
fc -l |
列出历史记录 (类似 history) |
fc -e vi |
用 vi 编辑并执行最近的一条命令 |
HISTSIZE / HISTFILE |
在 ~/.profile 中配置历史记录的大小和路径 |
掌握 history 命令及其相关技巧,可以极大地提高你在 AIX 系统上的命令行操作效率。
