如何使命令行历史记录适用于所有终端

斯科特·古德盖姆

我总是至少打开 3 个终结器(一个终端程序)窗口,但有时打开另一个终端只是为了快速做一些事情。我怎样才能使命令历史在所有这些命令中都是通用的?

斯科特·古德盖姆

感谢上面 gertvdijk 提供的链接,我从中发布了我最喜欢的解决方案。

这是我对 Bash 会话历史共享的尝试。这将启用 bash 会话之间的历史共享,历史计数器不会混淆,并且历史扩展如 !number 将在一些约束下工作。

在 Ubuntu 10.04 LTS (Lucid Lynx) 下使用 Bash 版本 4.1.5。

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "$@"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync

说明:函数 history() 覆盖内置历史记录以确保历史记录在显示之前同步。这对于按数字进行历史扩展是必要的(稍后会详细介绍)。

将刚刚输入的行附加到 $HISTFILE(默认为 .bash_history)。这将导致 $HISTFILE 增加一行。

将特殊变量 $HISTFILESIZE 设置为某个值将导致 Bash 通过删除最旧的条目将 $HISTFILE 截断为不超过 $HISTFILESIZE 行。

清除正在运行的会话的历史记录。这会将历史计数器减少 $HISTSIZE 的数量。

读取 $HISTFILE 的内容并将它们插入到当前正在运行的会话历史记录中。这将使历史计数器增加 $HISTFILE 中的行数。请注意,$HISTFILE 的行数不一定是 $HISTFILESIZE。

更多解释:步骤 1 确保来自当前运行会话的命令被写入全局历史文件。

步骤 4 确保来自其他会话的命令被读入当前会话历史记录。

因为第 4 步会增加历史计数器,我们需要以某种方式减少计数器。这是在步骤 3 中完成的。

在步骤 3 中,历史计数器减少了 $HISTSIZE。在步骤 4 中,历史计数器由 $HISTFILE 中的行数增加。在第 2 步中,我们确保 $HISTFILE 的行数正好是 $HISTSIZE(这意味着 $HISTFILESIZE 必须与 $HISTSIZE 相同)。

关于历史扩展的约束:通常,一旦您有多个 Bash 会话,就无法保证按数字进行的历史扩展将在两次 Bash 提示显示之间保留其值。每次执行 PROMPT_COMMAND 时,来自另一个 Bash 会话的某些命令可能会潜入您当前的会话历史记录中,然后历史记录编号将不同。这意味着您始终必须在使用之前立即查找该号码。我觉得这个限制是合理的。反正我每次都得查这个数字,因为我记不起任意的历史数字。

通常我使用这样的数字扩展历史

$ history | grep something #note number
$ !number

我建议使用以下 Bash 选项。

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify

奇怪的错误:运行通过管道传输到任何内容的历史命令将导致该命令在历史记录中列出两次。例如:

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false

都将被列入历史两次。我不知道为什么。

改进思路:修改函数 _bash_history_sync() 使其不会每次都执行。例如,它不应在提示符下按 CTRL+C 后执行。当我决定不想执行该行时,我经常使用 CTRL+C 来丢弃长命令行。有时我必须使用 CTRL+C 来停止 Bash 完成脚本。

当前会话中的命令应该始终是当前会话历史中的最新命令。这也将产生副作用,即给定的历史编号保留其来自该会话的历史条目的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在远程Ubuntu终端会话上启用命令行历史记录?

来自分类Dev

如何访问所有Emacs命令的历史记录?

来自分类Dev

通过命令行清除Firefox历史记录

来自分类Dev

是否有一个集中的历史记录文件,用于从各个终端运行的所有命令?

来自分类Dev

是否有一个集中的历史记录文件,用于从各个终端运行的所有命令?

来自分类Dev

如何在命令行历史记录中搜索以前使用的命令?

来自分类Dev

如何在命令行历史记录中搜索以前使用的命令?

来自分类Dev

如何使Windows 8.1命令行保存命令历史记录?

来自分类Dev

Ubuntu-命令历史记录不适用于新创建的用户

来自分类Dev

如何从特定时间段删除命令行历史记录?

来自分类Dev

如何获取其他用户的命令行历史记录?

来自分类Dev

读取OS X中的所有终端命令历史记录

来自分类Dev

如何合并终端上重复的命令历史记录?

来自分类Dev

运行 drush 时防止在命令行历史记录中记录敏感数据

来自分类Dev

如何清除终端历史记录?

来自分类Dev

如何清除终端历史记录

来自分类Dev

从命令历史记录中完成命令行

来自分类Dev

将历史记录命令放到命令行中而不执行

来自分类Dev

是否可以浏览特定命令的命令行历史记录?

来自分类Dev

如何通过命令行显示apt-get软件包管理历史记录?

来自分类Dev

如何通过命令行显示apt-get软件包管理历史记录?

来自分类Dev

如何将历史记录从Windows命令行导出到文本文件?

来自分类Dev

如何获取CLPPLUS SQL命令的所有历史记录?

来自分类Dev

如何在所有 shell 中保存命令历史记录

来自分类Dev

如何添加顶部栏菜单;文件,视图,历史记录,工具...适用于18.04中的应用程序?

来自分类Dev

从命令行或PowerShell查看部署历史记录

来自分类Dev

传递到less -S而不清除命令行历史记录的输出

来自分类Dev

命令行中的MySQL向后和向前搜索历史记录

来自分类Dev

通过命令行配置Windows 8 / 8.1 / 10文件历史记录

Related 相关文章

  1. 1

    如何在远程Ubuntu终端会话上启用命令行历史记录?

  2. 2

    如何访问所有Emacs命令的历史记录?

  3. 3

    通过命令行清除Firefox历史记录

  4. 4

    是否有一个集中的历史记录文件,用于从各个终端运行的所有命令?

  5. 5

    是否有一个集中的历史记录文件,用于从各个终端运行的所有命令?

  6. 6

    如何在命令行历史记录中搜索以前使用的命令?

  7. 7

    如何在命令行历史记录中搜索以前使用的命令?

  8. 8

    如何使Windows 8.1命令行保存命令历史记录?

  9. 9

    Ubuntu-命令历史记录不适用于新创建的用户

  10. 10

    如何从特定时间段删除命令行历史记录?

  11. 11

    如何获取其他用户的命令行历史记录?

  12. 12

    读取OS X中的所有终端命令历史记录

  13. 13

    如何合并终端上重复的命令历史记录?

  14. 14

    运行 drush 时防止在命令行历史记录中记录敏感数据

  15. 15

    如何清除终端历史记录?

  16. 16

    如何清除终端历史记录

  17. 17

    从命令历史记录中完成命令行

  18. 18

    将历史记录命令放到命令行中而不执行

  19. 19

    是否可以浏览特定命令的命令行历史记录?

  20. 20

    如何通过命令行显示apt-get软件包管理历史记录?

  21. 21

    如何通过命令行显示apt-get软件包管理历史记录?

  22. 22

    如何将历史记录从Windows命令行导出到文本文件?

  23. 23

    如何获取CLPPLUS SQL命令的所有历史记录?

  24. 24

    如何在所有 shell 中保存命令历史记录

  25. 25

    如何添加顶部栏菜单;文件,视图,历史记录,工具...适用于18.04中的应用程序?

  26. 26

    从命令行或PowerShell查看部署历史记录

  27. 27

    传递到less -S而不清除命令行历史记录的输出

  28. 28

    命令行中的MySQL向后和向前搜索历史记录

  29. 29

    通过命令行配置Windows 8 / 8.1 / 10文件历史记录

热门标签

归档