如果你需要花很多时间在命令行上,查看之前运行过的历史命令会是一个有用的特性。它能够让你日复一日的工作变得更容易,更高效。
在这篇文章中,我们将会谈论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命令是执行倒数第几行的意思。在下面的例子中,我们执行467行的命令:
!467另一个执行命令的方式是使用!word表达式。word匹配最近命令列表中以“word”开头的命令。
通常,history显示很多行输出,一个屏幕显示不下。为了一次显示一页输出,我们将结果传给翻页程序例如more或者less命令:
history | less显示最后n行,把数字作为参数传递给命令。例如,只要查看历史列表中的最后 5 行,我们输入:
history -5使用 up 和 down 按键来浏览列表中的条目。当你想要找的命令展示出来时,你可以输入Enter执行这个命令。
输入!!可以执行前一个命令:
!!当你忘记了之前使用sudo执行的命令时,这个特别有用。你不需要重新输入之前的命令:
sudo !!-1和!!一样,都是执行历史列表中的最后一个命令。!-2执行倒数第二个命令,以此类推。
^word1^word2^允许你重新执行最后执行的命令(将“word1”替换成“word2”)。如果你不小心输入sduo command,而不是sudo command,你可以重新使用正确的单词再运行一遍这个命令:
^sduo^sudo^使用grep命令可以过滤输出结果。例如,查看所有命令中包含"nano"的,你可以这样运行:
history | grep nano302 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 手册,获取更多信息。
默认情况下,当启动一个新会话时,Bash 会从.bash_history文件中读取历史命令列表。当前会话中执行的命令列表会被保存在内存中,并且当会话关闭时,保存到文件。
如果你打开了好几个 Shell 会话,仅仅最后一个关闭的会话历史会被保存。
-a 选项允许你保存当前会话历史到.bash_history文件。
history -a-w选项将会把完整的历史列表全部写入历史文件.
history -whistory 命令允许你清除完整的历史列表或者移除其中的一部分。
为了清除历史列表,使用-c选项
history -c为了从历史列表中删除指定行或者指定几行,使用-d选项。
例如:为了移除 365 和 375 (包括那些行),你将输入:
history -d 365 375如果你仅仅提供一个数字给-d选项,这个命令将会移除这一行。
当使用了一个负数时,倒数第几个命令将会被删除。
上面的命令清除了保存在内存中的历史列表,但是没有从磁盘上.bash_history文件中移除。为了在文件中移除,你需要写入历史命令列表到文件中:
history -c
history -wBash 历史的行为可以通过几个不同的环境变量进行定义。当你要修改历史行为,在~/.bashrc或者其他任何用户登录需要加载的配置文件中.
默认情况下,Bash 只保留 500 行历史命令列表。这个HISTSIZE变量允许你修改这个值。为了将这个值修改为 10000,你可以将下面的代码添加到.bashrc文件中:
HISTSIZE=10000HISTCONTROL接受一个冒号分隔的值来定义命令如何被保存的在历史列表中的:
ignorespace 以空白开头的命令不保存在历史列表中ignoredups 重复的命令不保存在历史列表中ignoreboth 这是一个简写,包含ignorespace和ignoredupsHISTSIZE=ignoreboth当 HISTTIMEFORMAT 被设置时,Bash 会在每一行预先保存命令执行时间。
例如,如果你设置:
HISTTIMEFORMAT="%F %T: "历史命令列表将会显示成下面的格式:
413 2019-10-27 21:13:07: sudo nano /etc/hostshistory命令显示之前执行的命令列表。例如,你可以使用history去查看一个你以前用过,但又记不住的长命令。