Linux / 命令 / history / 显示先前执行命令列表的命令
在 Linux 中,Bash 中的 history 命令显示当前 shell 管理的带有编号的命令历史。您可以查看历史以查找以前的命令或重新执行它们,历史的范围和保存取决于 shell 设置。
检查命令历史
在交互式 Bash 终端中输入以下命令。history 是一个内置的 Bash 命令,用于输出当前 shell 的历史记录列表。
history
输出显示每个条目的编号和命令。例如,一行显示 42 pwd 表示 shell 历史记录中的第 42 项是 pwd。编号和内容会因账户、会话和历史记录设置的不同而有所变化,因此不要直接使用示例中的编号。你输入的命令会被记录,而不是执行结果。
要仅查看最近的条目,可以指定一个数字。以下命令显示历史记录中的最后 10 条记录。
history 10
此 history 10 命令本身可能包含在列表中。如果所需的命令未出现,请检查历史记录功能、存储大小和排除设置。
搜索并重新执行命令
在 Bash 的默认交互输入中,按上箭头键可以调用并编辑以前的条目。按 Ctrl+R 并输入搜索词可以向后搜索历史记录。您可以检查找到的命令内容,然后执行或修改它。
在启用历史扩展的交互式 Bash 中,!! 会扩展为前一个历史条目。!n 指的是列表中编号为 n 的项目。例如,以下命令将在当前列表中存在编号 42 的项目时运行该项目。
!42
首先确保编号与实际历史匹配。历史扩展通常会在输入后立即执行,因此在执行如文件删除或配置更改等命令时需要特别小心。在非交互式 shell 中,历史扩展通常默认被禁用,并且在其他 shell 中的行为可能有所不同。
如果只是想查看前一个条目的扩展结果而不执行它,可以将其用单引号括起来,并按以下方式输入。屏幕上显示的命令将不会被执行。
history -p '!!'
如果你设置 shopt -s histverify,那么在使用 Readline 的交互式 Bash 中,展开的命令将显示在编辑行上,允许你在执行前检查它们。要在当前 shell 中恢复设置,请使用 shopt -u histverify。有关详细信息,请参阅 Bash 历史扩展文档。
历史记录的保存位置和时间
Bash 将历史记录作为内存中的列表进行管理,并在启动时从 HISTFILE 指定的文件读取历史记录。典型的默认文件是 ~/.bash_history,但这可能因环境或 POSIX 模式而异。你可以使用以下命令检查当前设置。
printf '%s\n' "$HISTFILE"
当一个具有活动历史的 shell 退出时,其历史会被保存到一个文件中,但如果该文件不可写,HISTFILE 未设置或为空,则不会保存。多个终端各自拥有独立的历史记录,因此在一个终端执行的命令可能不会立即出现在另一个终端中。根据 histappend 选项,退出时将向文件追加历史记录或覆盖文件,结果取决于设置和同时运行的会话。
history -a 会将当前会话中尚未添加的新条目附加到历史文件中。另一方面,history -w 会用当前列表覆盖历史文件,这可能导致丢失其他会话的历史记录。如果使用多个终端,请在使用前检查此差异。保存行为可以在 Bash 历史功能文档 中找到。
检查历史记录大小和排除设置
HISTSIZE 控制内存中历史条目的数量,而 HISTFILESIZE 控制历史文件中的最大行数。多行条目在文件的行数中是例外。可以通过以下方式检查当前值。
printf 'HISTSIZE=%s\nHISTFILESIZE=%s\nHISTCONTROL=%s\nHISTIGNORE=%s\n' "$HISTSIZE" "$HISTFILESIZE" "$HISTCONTROL" "$HISTIGNORE"
HISTCONTROL 和 HISTIGNORE 可以决定哪些输入应从历史记录中排除。例如,如果 HISTCONTROL 包含 ignorespace,开头带空格的输入可能会从历史列表中排除。这仅是与 shell 历史相关的设置,并不会删除其他日志或程序中留下的历史记录。
删除历史记录和敏感信息
history -d n 从当前 shell 的历史列表中删除编号为 n 的项目。首先,用 history 检查实际编号。history -c 清除整个当前列表,因此应谨慎使用。这两个命令不会自动删除已保存的历史文件或其他 shell 的历史列表。
避免在命令行中直接输入密码或令牌,因为它们可能会保留在历史记录或其他地方。如果秘密信息已经被泄露,不要认为仅仅删除历史记录就能解决问题;相反,应更换凭证并检查相关泄露的范围。




