结合tty的历史

时间:2013-08-15 17:44:42

标签: linux bash

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

 1 session running something
 1 session looking at output
 1 session shuffling files to/from various places

如果在任何时候我失去了所有三个连接,我会丢失2/3的历史记录,因为当我重新登录时,我从三个连接中的随机1中获取历史记录。

有没有办法停止此操作并将所有三个历史文件合并为1?

或者,是否有办法将每个登录声明为“ttyN”,从而使每个登录的单独历史分开,但可检索/可重新连接?

谢谢!

5 个答案:

答案 0 :(得分:1)

可能的解决方案?

打开终端/屏幕后

使用History-File设置启动shell:

HISTFILE=$HOME/session1-history  bash

并继续使用此bash。  运行不同的会话历史记录

HISTFILE=$HOME/session2-history  bash

答案 1 :(得分:1)

只需将其添加到.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"

在此Unix Stackexchange post找到了这个答案。

我尝试了这个,它似乎同时在多个终端上工作,只有赶上你执行命令让终端从.bash_history获取最新的历史记录。

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

答案 2 :(得分:1)

有一个用于bash和zsh的开源shell历史记录器可以解决你的问题(免责声明:我编写并维护它)。

https://github.com/barabo/advanced-shell-history

我们的想法是使用内置的bash钩子将命令写入sqlite3数据库。如果你真的需要回过头来弄清楚你输入的命令/他们跑了多长时间/他们的退出代码是什么 - 你应该试一试。

它多次救了我。

答案 3 :(得分:0)

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

您需要将这些行放在~/.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键以查看每个会话中最近添加的历史记录。

有关更强大的解决方案,请参阅:http://ptspts.blogspot.in/2011/03/how-to-automatically-synchronize-shell.html

答案 4 :(得分:-1)

您可以设置许多选项来阻止Bash实例覆盖彼此的历史记录。有关完整说明,请参阅this FAQ

.bashrc中,添加

HISTFILESIZE=400000000
HISTSIZE=10000
PROMPT_COMMAND="history -a"
export HISTSIZE PROMPT_COMMAND
shopt -s histappend