如果你需要花很多时间在命令行上,查看之前运行过的历史命令会是一个有用的特性。它能够让你日复一日的工作变得更容易,更高效。
在这篇文章中,我们将会谈论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 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 手册,获取更多信息。
默认情况下,当启动一个新会话时,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
这是一个简写,包含ignorespace
和ignoredups
HISTSIZE=ignoreboth
当 HISTTIMEFORMAT
被设置时,Bash 会在每一行预先保存命令执行时间。
例如,如果你设置:
HISTTIMEFORMAT="%F %T: "
历史命令列表将会显示成下面的格式:
413 2019-10-27 21:13:07: sudo nano /etc/hosts
history
命令显示之前执行的命令列表。例如,你可以使用history
去查看一个你以前用过,但又记不住的长命令。