历史文件可以在bash中统一吗?


35

我通常screen在Linux台式机和服务器上运行多个会话。

这样做的问题是,当我grep浏览命令历史记录时,发现在另一个会话中发出了命令,因此必须分离并重新连接才能获得该历史记录项。

是否可以将多个会话中不同更新的历史“强制”为全部历史?


我遇到了一个类似的问题,即我无法查看终端会话之间的历史记录。原来我的〜/ .bash_history文件是root拥有的,不可写。将所有者/组更改为我的用户可解决此问题:sudo chown <用户>:<组>〜/ .bash_history
mateo

Answers:


41

您需要做两件事:

  1. 插入命令shopt -s histappend.bashrc。这将追加到历史记录文件中,而不是覆盖它。
  2. 同样在您的中.bashrcPROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"每次bash显示提示时,insert 和history文件将被重写和重新读取。

编辑:感谢e-t172的history -n把戏


6
谢谢你 我使用PROMPT_COMMAND =“ $ PROMPT_COMMAND; history -a; history -n”进一步改进了它。这样,在其他会话中发出的命令将立即出现在当前会话的历史记录中(嗯,您需要先按Enter键才能更新历史记录)。
Etienne Dechamps,2009年

8
我以前没有PROMPT_COMMAND定义,所以我不得不使用它PROMPT_COMMAND="history -a; history -n"来避免错误。
威廉·杰克逊

1
有关正确的历史记录-a,-c和-r命令,请参见superuser.com/a/734410/250287答案。
2014年

只是向新来者发出警报:使用历史记录重写一段时间后,我意识到我经常发出错误的命令。当您在上一行看到某些命令时,您希望向上箭头重复该命令,并且使用此配置不再总是这种情况。
Tiago

10

请不要使用history -a; history -n,它不会按您预期的那样工作,并且会在您的历史记录中留下许多重复的,乱序的命令。以下是通常可以正常工作的解决方案:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

使用换行符代替分号也是使用PROMPT_COMMAND处理丢失/重复的分号问题的一种简短方法。


历史-a,-c,然后-r是正确的...这应该是公认的答案
mtd 2014年

1
export是没有必要的。因为应该设置~/.bashrc从每个子Shell调用的交互式Shell选项,所以不需要继承。
dolmen 2015年

是否有充分的理由不仅仅使用PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"替代方法?
6

由于许多提示命令都依赖或显示该退出命令,因此在运行历史记录命令之前,该排序将需要存储最后一个退出值。
亚当·克兰

-1

在某些发行版中,默认情况下未定义PROMPT_COMMAND。例如,它在Arch中定义,但在Debian中未定义。

我的Dropbox中有一个bashrc,可在发行版跳跃时使用,它包括:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"

一个基本的shell编程问题的糟糕解决方案。正确的方法:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
Domen),

更好:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
dolmen 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.