Linux 中 history 命令的用法

如果您在命令行上花费大量时间,则查看以前运行的命令的历史记录可能是一项有用的功能,可以使您的日常工作更加轻松并提高生产率。

在本文中,我们将讨论该 history 命令,该命令使您可以查看以前执行的命令的列表,在列表中进行搜索以及操作历史记录文件。

使用 history 命令和扩展

history 是 Shell 内置的命令,不同 Shell 的行为可能略有不同。我们这里介绍 Bash 内置的 history 命令。

以最简单的形式,在没有任何选项或参数的情况下调用该 history 命令时,该命令将显示带有行号的整个历史记录列表。

history
...
467  git push
468  tail -f var/logs/error
469  nano +22,5 functions.sh
470  source project-env/bin/activate
471  history

直接输入 !n 将执行历史记录列表中的第 n 条命令, 直接输入 !-n 将执行历史记录列表中的倒数的第 n 条命令。在以下示例中,我们在以下行执行命令 467

!467

执行命令的另一种方法是使用 !word 扩展。 word 是指以 “word” 开头的最新命令。

通常, history 命令在屏幕上显示所有的输出。如果想分页查看输出,请将其通过管道传递到诸如 moreless 命令:

history | less

要显示最后 n 几行,请将数字作为参数传递给命令。例如,要仅查看历史记录列表的最后五行,请输入:

history -5

使用 updown 箭头键浏览列表中的条目。显示搜索到的命令后,按 Enter 即可执行。

输入 !! 以执行上一条命令:

!!

举个例子,如果您在执行命令的时候忘记加上 sudo 了,这时候您不必重新输入命令,您可以直接输入下面的命令,这特别有用:

sudo !!

!-1!! 的作用一样,都是执行历史记录列表中的最后一个命令, !-2 倒数第二个,依此类推。

^word1^word2^ 扩展允许您重新运行最后一个命令,并将命令中的 “word1” 替换为 “word2” 。如果您不小心输错了 sduo command,则可以使用以下命令来执行 sudo command

^sduo^sudo^

使用 grep 命令来过滤输出。例如,要查看包括 “nano” 在内的所有命令,请运行:

history | grep nano
302  sudo nano /etc/resolv.conf
356  nano setup.py
413  sudo nano /etc/hosts
469  nano +22,5 functions.sh

现在,如果要重新运行 nano setup.py 命令,只需输入:

!356

搜索命令历史记录的另一种方法是按 Ctrl-R 。提示将变为以下内容,您可以开始搜索先前执行的命令。

(reverse-i-search)`':

Shell 将显示一条匹配的行。要查看至下一个匹配项,请再次按 Ctrl-R

查看 Bash 手册,以获取有关 history 命令扩展,修饰符和操作符的更多信息。

保存历史记录列表

默认情况下,启动新会话时, Bash 从 .bash_history 文件读取历史记录列表。当前会话中执行的命令列表保留在内存中,并在关闭会话时保存到文件中。

如果打开了多个 Shell 会话,仅保存最后关闭的会话的历史记录。

-a 选项使您可以将当前会话历史记录列表保存到 .bash_history 文件中:

history -a

-w 选项将完整的历史记录列表写入历史记录文件。

history -w

清除历史记录

history 命令允许您清除完整的历史记录列表或删除某些部分。

要清除历史记录列表,请使用以下 -c 选项:

history -c

要从历史记录列表中删除起始位置和结束位置之间的特定行,请使用 -d 选项。

例如,要删除 365 和 375 之间的行(包括那些行),请输入:

history -d 365 375

如果您仅向该 -d 选项提供一个数字,该命令将删除给定的行。

当使用负整数时,行将从历史记录列表的末尾算起。

上面的命令在内存中清除历史记录列表,但不会从 .bash_history 磁盘上的文件中删除条目。要清除文件,您需要将历史记录列表写入文件:

history -c
history -w

修改历史记录行为

可以使用几个不同的环境变量来定义 Bash 历史记录的行为。修改历史记录行为时,请在中设置变量 ~/.bashrc 或在用户登录时加载的任何其他配置文件。

默认情况下, Bash 在命令历史记录列表中保留 500 行。 HISTSIZE 变量允许您更改此值。要将其设置为 10000 ,请在 .bashrc 文件中添加以下行:

HISTSIZE=10000

HISTCONTROL 变量接受用冒号分隔的值列表,这些值定义了如何在历史记录列表中保存命令:

  • ignorespace - 以空格开头的命令未保存在历史记录列表中。
  • ignoredups - 不保存重复的命令。
  • ignoreboth - 是 ignorespaceignoredups的简写 。
HISTCONTROL=ignoreboth

HISTTIMEFORMAT 变量被设置,会记录命令的时间戳。

例如,如果您设置:

HISTTIMEFORMAT="%F %T: "

历史记录将以以下格式显示:

413  2019-10-27 21:13:07: sudo nano /etc/hosts

结论

history 命令显示以前执行的命令的列表。例如,您可以使用 history 来查看您之前忘记的长命令。