我可以在多个屏幕窗口中轻松搜索历史记录吗?


11

我当前的screen会话有12个打开的窗口。它已经运行了几个星期...我知道我上周某个时候convert在这12个屏幕窗口之一中执行了ImageMagick 命令...有什么方法可以轻松地搜索所有12个实例的Bash历史记录,而无需关闭它们或运行它们history | grep convert在所有12个屏幕中?


1
我使用岩组和我setopt share_history/etc/zsh/zshrc所以这个问题不应该发生在我身上:P
phunehehe

Answers:


18

您可以history -a; history -c在所有窗口中运行以保存历史记录。然后history -r刷新它。

要更永久地解决它,请将其添加到您的.bashrc

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

2
太好了,谢谢!唯一的问题是,如果您在一个外壳中键入内容,然后转到另一个外壳并立即键入历史记录,则它不会显示在历史记录中。这是因为PROMPT_COMMAND尚未执行,因此刷新尚未发生。您必须先在第二个窗口中按回车键(或运行另一个命令),然后键入历史记录。
Javid Jamae

1

听起来很难。这里有一些可能对您有用的方法。

如果您已经安装了流程记帐工具(在Linux上,请查找名为的软件包acct)并具有使用它们的许可权,那么您可以确定何时以及可能在哪个终端上运行convert

lastcomm convert

如果这不可用或不确定,则可以history在每个bash实例中执行命令以查找convert命令。这也将查找bash启动时历史文件中的命令。

: >/tmp/convert.history
for w in $(seq 0 11); do
  screen -p $w -X stuff \
    'history | sed 's/^.*convert/'$w'&/" >>/tmp/convert.history
'; done
  • $(seq 0 11)遍历屏幕窗口的数量。确保跳过当前未运行bash的窗口,但跳过其他会不同地解释输入的窗口。
  • screen -p $w stuff …将以下字符串作为输入发送到指定的窗口。您需要在字符串末尾使用换行符。
  • 如果您在窗口3中运行,该文件/tmp/convert.history将包含诸如行的列表。3 convert foo.jpgconvert foo.jpg

1
不幸的是,这些没有用。:-(我刚history | grep convert在所有窗口中运行。我很失望,我想接受Gilles的另一个不错的答复!
乔什

1

tcsh允许您通过使用定期别名在会话之间共享历史记录。

在您的.cshrc(或.tcshrc)文件中:

set tperiod = 60 #(or any other number.  Time in minutes between refreshing)
alias periodic 'history -S; echo "Syncing history"'

这将每60分钟自动执行一次history命令。这会将历史记录保存到主目录中的公共历史记录文件中。要更频繁地更新历史记录,请降低时间号,或简单地执行“ periodic”命令以手动刷新


0

Bash仅在退出时才写入历史记录,这充其量是有问题的。我听说zsh可以在活动会话之间共享历史记录。

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.