Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 跨tty合并历史记录_Linux_Bash - Fatal编程技术网

Linux 跨tty合并历史记录

Linux 跨tty合并历史记录,linux,bash,Linux,Bash,在任何给定时间,我都有3次登录到同一服务器。当然,我经常使用screen,但假设这一目的允许我: 1 session running something 1 session looking at output 1 session shuffling files to/from various places 如果在任何时候我丢失了所有三个连接,我会丢失2/3的历史记录,就像当我重新登录时,我从三个连接中的随机1个获得历史记录一样 是否有方法停止此操作并将所有三个历史文件合并为1 或者,是否

在任何给定时间,我都有3次登录到同一服务器。当然,我经常使用screen,但假设这一目的允许我:

 1 session running something
 1 session looking at output
 1 session shuffling files to/from various places
如果在任何时候我丢失了所有三个连接,我会丢失2/3的历史记录,就像当我重新登录时,我从三个连接中的随机1个获得历史记录一样

是否有方法停止此操作并将所有三个历史文件合并为1

或者,是否有一种方法可以将每个登录名声明为“ttyN”,从而使每个登录名的历史记录保持独立,但可以检索/重新连接


谢谢

可以设置许多选项来防止Bash实例相互覆盖历史记录。有关详细说明,请参见:

.bashrc
中,添加

HISTFILESIZE=400000000
HISTSIZE=10000
PROMPT_COMMAND="history -a"
export HISTSIZE PROMPT_COMMAND
shopt -s histappend
可能的解决方案

打开终端/屏幕后

使用历史文件设置启动shell:

HISTFILE=$HOME/session1-history  bash
并继续与本次盛会合作。 运行不同的会话历史记录

HISTFILE=$HOME/session2-history  bash

等等。

如果我正确理解了您的要求,您将打开多个终端会话,并希望在一个会话中输入的命令通过其他会话中的历史记录可用

您需要将这些行放在
~/.bashrc
的顶部:

export HISTFILESIZE=100000
export HISTSIZE=100000
# avoid & erase dups
export HISTCONTROL=ignoredups:erasedups
shopt -s histappend
# save & reload history after each command enter in shell
export PROMPT_COMMAND="\history -a; \history -c; \history -r; $PROMPT_COMMAND"
最重要的是
histappend
,它确保每次都将新的历史记录行追加到历史记录文件中

PS:您需要按enter键查看每个会话中最近添加的历史记录


有关更健壮的解决方案,请参见:

只需将其添加到
.bashrc
文件中即可

# Avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  

# Append history entries..
shopt -s histappend    

# After each command, save and reload history
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
在这里找到了这个答案

我尝试了这个,它似乎可以同时在多个终端上工作,唯一的问题是您必须执行一个命令,让终端从.bash_history获取最新的历史记录


例如,如果我打开第一个终端并键入
echo check 1
,然后打开第二个终端并键入
echo check 2
。现在,如果我返回到第一个终端并按up键,我将不会得到
echo check 2
,因为上次从历史文件中获取历史是在我执行上一个命令时。因此,我只需按
Enter
,而无需指定命令,它将获取最后的历史记录条目。现在,如果我按向上键,它将显示
echo check 2
,这是预期的行为。

有一个针对bash和zsh的开源shell历史记录器,可以解决您的问题(免责声明:我编写并维护了它)

其思想是使用内置bash钩子将命令写入sqlite3数据库。如果您真的需要返回并找出您输入的命令/它们运行了多长时间/它们的退出代码是什么-您应该尝试一下


它救了我很多次。

似乎不起作用。我将其插入到.bashrc中,重新启动(无论如何都需要这样做),重新登录时,会话2中的tty命令不在会话1的历史记录中。反之亦然。这只会防止不同的shell覆盖历史文件。它不会使一个正在运行的shell的历史在另一个shell中实时可用。如果您按任意顺序关闭两个shell并启动第三个shell,您将看到第三个shell中同时提供了两个shell的历史记录,而不是启动之前仅提供一个shell。您需要您的历史记录做什么?从零开始解决您的问题似乎并非易事……您可以定义bash必须使用的历史文件的名称。在bash进程退出时写入该文件。(但我从来没有使用过。)使用这个,你可以有3个不同的历史文件,只要你用不同的“HISTFILE”设置启动你的bash