最全面的 history
命令指南
history
命令在 Linux 和 Unix 系统中扮演着重要角色,它记录了用户在终端中执行的所有命令,并提供了多种方式来管理和利用这些历史记录。本文将从基础到高级全面介绍 history
命令,包括相关的 Shell 设置和选项,如 set +o history
。
一、history
命令的基本用法
1. 显示命令历史
最常见的用法是直接输入 history
,显示当前会话中的所有命令记录:
$ history
2. 显示指定数量的历史记录
你可以通过传递一个数字参数来限制显示的历史记录条数:
$ history 10
3. 清空历史记录
使用 -c
选项可以清空当前会话的所有历史记录:
$ history -c
4. 删除特定的历史记录
使用 -d
选项可以删除指定编号的历史记录:
$ history -d 5
5. 保存历史记录
使用 -w
选项可以手动将当前会话中的历史记录保存到历史文件中:
$ history -w
二、history
命令的高级用法和选项
1. -a
:追加当前会话的历史记录到历史文件
将当前会话中的新命令追加到历史文件中,而不影响现有历史记录:
$ history -a
2. -n
:从历史文件中读取新增的记录
读取历史文件中新增的命令,并将它们添加到当前会话的历史列表中:
$ history -n
3. -r
:从历史文件中读取记录到当前会话
将历史文件中的命令读取到当前会话中,适用于多个会话共享历史记录的情况:
$ history -r
4. -w
:将当前会话的命令写入历史文件
立即将当前会话的命令写入历史文件,不必等到会话结束:
$ history -w
5. -p
:显示历史记录命令但不保存到历史记录中
-p
选项可以显示并执行一组命令,但这些命令不会被保存到历史记录中:
$ history -p 'ls -la'
6. -s
:将命令追加到历史列表中
使用 -s
选项可以将特定命令手动添加到历史记录中,而不会执行该命令:
$ history -s "echo Hello World"
7. -o
:将历史记录写入指定文件
使用 -o
选项可以将历史记录写入指定的文件,而不是默认的历史文件。这会覆盖目标文件中的内容:
$ history -o /path/to/filename
8. 使用 !
执行历史记录中的命令
!!
:重复执行上一条命令。$ !!
!n
:执行编号为n
的历史命令。$ !5
!string
:执行最近一次以string
开头的命令。$ !ls
!?string?
:执行最近一次包含string
的命令。$ !?cat?
!^
:使用上一条命令的第一个参数。$ echo !^
!$
:使用上一条命令的最后一个参数。$ echo !$
9. HISTTIMEFORMAT
:显示命令执行时间
通过设置 HISTTIMEFORMAT
变量,可以在历史记录中显示每条命令的执行时间:
export HISTTIMEFORMAT="%F %T "
重新加载 .bashrc
文件后,将在 history
输出中看到时间戳:
$ source ~/.bashrc
10. HISTCONTROL
:管理历史记录的行为
HISTCONTROL
变量允许你控制哪些命令被记录在历史中:
ignoredups
:忽略重复的命令。ignorespace
:忽略以空格开头的命令。ignoreboth
:同时忽略重复命令和以空格开头的命令。
设置示例:
export HISTCONTROL=ignoreboth
11. HISTIGNORE
:忽略特定命令
通过设置 HISTIGNORE
变量,可以指定不保存到历史记录中的命令。你可以指定多个命令,使用 :
分隔:
export HISTIGNORE="ls:pwd:exit"
12. HISTSIZE
和 HISTFILESIZE
:控制历史记录的大小
HISTSIZE
:控制内存中保留的历史记录条数。HISTFILESIZE
:控制历史文件中保留的历史记录条数。
设置示例:
export HISTSIZE=1000
export HISTFILESIZE=2000
13. HISTFILE
:指定历史记录文件
通过设置 HISTFILE
变量,你可以指定保存历史记录的文件路径:
export HISTFILE=~/.my_custom_history
14. HISTCMD
:获取当前命令的历史编号
HISTCMD
变量保存了当前命令在历史记录中的编号,你可以使用它来跟踪当前命令的历史编号:
echo "当前命令编号是:$HISTCMD"
15. shopt -s histappend
:追加历史记录
默认情况下,每次会话结束时,历史记录文件会被覆盖。使用 shopt -s histappend
可以将新命令追加到历史文件中,而不是覆盖它:
shopt -s histappend
16. shopt -s cmdhist
:多行命令存储为一条历史记录
启用 cmdhist
后,输入的多行命令将作为一条命令存储在历史记录中:
shopt -s cmdhist
17. shopt -s lithist
:多行命令在历史记录中显示时保留原格式
启用 lithist
后,多行命令在历史记录中显示时将保留其原始格式:
shopt -s lithist
18. !$
和 !*
引用参数
!$
:引用上一条命令的最后一个参数。$ echo !$
!*
:引用上一条命令的所有参数。$ cp /path/to/file /backup/ $ mv !* /another_location/
19. ^old^new
:替换历史命令中的文本
history
允许你对上一条命令进行快速的文本替换:
$ ^Hello^Hi
20. Ctrl + r
:反向搜索历史记录
按 Ctrl + r
可以启动反向搜索,通过输入关键词搜索历史记录:
(reverse-i-search)`ls': ls -la
三、Shell 设置与历史记录的高级管理
1. set +o history
和 set -o history
使用 set +o history
可以暂时禁用命令历史记录功能。这意味着在禁用期间,任何输入的命令都不会被保存到历史记录中。要重新启用历史记录,可以使用 set -o history
。
# 禁用历史记录
$ set +o history
# 启用历史记录
$ set -o history
2. PROMPT_COMMAND
和自动保存历史记录
PROMPT_COMMAND
是一个环境变量,它包含的命令会在每次显示提示符之前执行。你可以利用它来自动保存历史记录:
export PROMPT_COMMAND='history -a; history -n'
这个设置会在每次命令执行后立即保存历史记录,并从文件中读取新记录,以确保多个终端会话之间的历史记录同步。
3. history -d -$HISTCMD
这个组合命令允许你删除当前执行的命令,确保它不会被保存到历史记录中。