文章目录
{ .ImgAlt }}

如果你需要花很多时间在命令行上,查看之前运行过的历史命令会是一个有用的特性。它能够让你日复一日的工作变得更容易,更高效。

在这篇文章中,我们将会谈论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命令是执行倒数第几行的意思。在下面的例子中,我们执行467行的命令:

!467

另一个执行命令的方式是使用!word表达式。word匹配最近命令列表中以“word”开头的命令。

通常,history显示很多行输出,一个屏幕显示不下。为了一次显示一页输出,我们将结果传给翻页程序例如more或者less命令:

阿里云: 爆款云服务器低至1折,1核1G 1M 仅17月/月
history | less

显示最后n行,把数字作为参数传递给命令。例如,只要查看历史列表中的最后 5 行,我们输入:

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。提示如下,你可以开始搜索之前的命令了。

阿里云: 爆款云服务器低至1折,1核1G 1M 仅17月/月
(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接受一个冒号分隔的值来定义命令如何被保存的在历史列表中的:

阿里云: 爆款云服务器低至1折,1核1G 1M 仅17月/月
  • ignorespace 以空白开头的命令不保存在历史列表中
  • ignoredups 重复的命令不保存在历史列表中
  • ignoreboth 这是一个简写,包含ignorespaceignoredups
HISTSIZE=ignoreboth

HISTTIMEFORMAT 被设置时,Bash 会在每一行预先保存命令执行时间。

例如,如果你设置:

HISTTIMEFORMAT="%F %T: "

历史命令列表将会显示成下面的格式:

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

结论

history命令显示之前执行的命令列表。例如,你可以使用history去查看一个你以前用过,但又记不住的长命令。




如果你有任何疑问,请通过以下方式联系我们:

微信:

微信群: 加上面的微信,备注微信群

QQ: 3217680847

QQ 群: 82695646 雪梦科技交流群

    版权声明:本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。知识共享许可协议
Vultr: 免费赠送50美元

相关推荐