我正在尝试弄清楚如何分叉/克隆保留其父级历史记录的终端。
我知道有一些解决方案可以让所有终端共享历史记录,但这并不是我想要的。
有时我在某个目录中工作时意识到我需要一个额外的终端 - 但仍然希望轻松访问该终端中的命令历史记录,而无需在其父终端之间来回切换。
注意:一旦子终端生成,两个终端就无需继续更新彼此的历史记录。
例子:
- 在终端 1 中执行的超长奇怪命令
- 需要额外的航站楼-2号航站楼已进入游戏。
- 过了一段时间,我终于在 1 号航站楼启动了 nano
- 需要来自 1 号航站楼的超长命令 - 但幸运的是它在 2 号航站楼的历史记录中!
答案1
简而言之:
要打开具有与当前会话相同的完整历史记录的新终端窗口,请运行:
history -a && gnome-terminal
完整解释:
Bash 历史记录的工作方式如下:
- 打开一个终端,启动一个 Bash 会话。
- Bash 从 加载旧历史记录
$HISTFILE
,通常是~/.bash_history
。 - 您可以在 Bash shell 中输入命令。这些命令将存储在内存中的临时历史记录中。
- 退出 Bash 会话或关闭终端窗口。
- 在 Bash 终止之前,它会将内存中的临时历史记录与
$HISTFILE
磁盘上保存的历史记录同步。
请注意,临时历史记录和持久历史记录都可能有大小限制,并且当它们变得太长时会被截断。
由于每个 Bash 实例仅在您的内存中写入临时历史记录,因此如果您并行启动第二个会话,则正在运行的会话中的操作不会出现:它将加载持久历史记录文件的旧版本!
如果需要同步两个 Bash 实例的临时历史记录,则需要通过持久历史记录文件执行此操作。有一个命令可以帮助您:history
$HISTFILE
要通过将新命令行附加到当前 Bash 会话的临时历史记录从 RAM 刷新到磁盘,请运行:history -a
此命令会自动调用,只要您退出 Bash 会话。
要从磁盘重新读取
$HISTFILE
并将其中的新命令行添加到当前 Bash 会话的临时历史记录中以供使用,请运行:history -r
此命令会自动调用,只要您启动 Bash 会话。
请注意两个命令前面的空格history
。它可以防止命令history
本身出现在 Bash 历史记录中。如果希望它出现在那里,只需省略开头的空格即可。
因此,要打开一个可以访问所有当前历史记录的新终端窗口,您需要先清除当前临时历史记录,然后使用新的 Bash 会话打开一个新终端:
history -a && gnome-terminal
再次注意开头的空格,以防止此命令出现在历史记录中。如果希望它出现在那里,请省略命令前面的空格。
如果您想要一个简短的命令,请创建一个 Bash 别名:
echo "alias newterminal='history -a && gnome-terminal'" >> .bash_aliases
如果需要,您还可以向 Gnome-Terminal 启动器添加上下文菜单项。如果需要,请在评论中提出请求。
要同步两个已打开的终端窗口的历史记录,首先刷新第一个窗口的历史记录,然后在第二个窗口中重新加载历史记录文件:
1 号航站楼(来源):
history -a
2 号航站楼(目标):
history -r
如果需要双向同步,首先history -a
在所有窗口上运行命令,然后在所有history -r
地方运行。
history
执行时可以找到有关该命令的更多信息
help history