我一直在打开多个终端。从2到10的任何位置,进行各种操作。现在,我们重新启动并打开另一组终端。有些人记得某些事情,有些则忘记了。

我想要一个历史记录:例如,如果我将ls合上一个,切换到另一个已经在运行的终端,然后按,ls就会出现)。
如果命令的前面有空格,请不要忘记命令。

我能做些什么使bash更像这样?

评论

我可以看到它的优点,但是我个人会讨厌它。我通常在终端中打开3或4个选项卡以用于非常特定的用途:一个用于运行“ make”,一个用于vi,一个用于运行东西,等等。因此,当我编译时,我转到选项卡1,单击并显示“ make”。出现,依此类推。这对我非常有帮助。因此,如果突然我进入我的“ make”选项卡并点击并出现一些随机的grep命令,我会很生气!虽然只是个人笔记

@axel_c足够正确。我无法想到一种明智的方式来做到这一点,即现有终端只能看到自己的历史记录,而新终端则可以看到按时间顺序排列的准确命令列表。

@Oli写道:“当现有终端只能看到自己的历史记录而新终端却可以看到按时间顺序排列的准确命令列表时,我想不出一种明智的方法。”怎么样(未尝试):export PROMPT_COMMAND =“ history -a; $ PROMPT_COMMAND”。现有的外壳程序会将每个命令添加到历史记录文件中,以供新的外壳程序查看,但仅显示其自己的历史记录。

您是将历史记录全部单独存储还是全部合并到一个历史记录文件中?

简短的答案是:bash开发人员不打算使用它。基于冲洗然后重新读取历史记录的解决方案可能会起作用,但是请注意Shlemiel The Painter。简而言之:每个命令之间的处理工作量与历史记录大小成正比。

#1 楼

将以下内容添加到您的~/.bashrc中:
 # Avoid duplicates
HISTCONTROL=ignoredups:erasedups
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
 


评论


此PROMPT_COMMAND解决方案的问题在于,每个历史记录项的编号在每个命令后都会更改:(。例如,如果您键入history和1)ls 2)rm,则执行!1重复1,则历史记录编号可能会更改,并且可能运行rm命令...

–克里斯·金普顿(Chris Kimpton)
2012年11月7日12:28



当我这样做时,当我在该终端中发出命令之后,直到我在该终端中发出命令后,其他已经打开的终端才没有最后输入的命令-这是预期的吗?如果是这样,是否有办法立即真正修改其他终端的历史记录?

– Suan
2012年12月19日,2:15

@Suan,根据命令,这对我来说似乎是正确的。我发现我们可以发出一个空命令(只需按Enter键)来更新历史记录。

–圣人
13年4月10日在18:13

实际上,根据对Bash历史记录问题的回答,历史记录-a(...)不会触发擦除重复项:Bash历史记录:“ ignoredups”和“ erasedups”设置与跨会话的通用历史记录冲突。此答案还给出了与HISTCONTROL = ignoredups:erasedups设置一起使用的历史记录-

#2 楼

因此,这就是我与历史有关的所有.bashrc问题:

export HISTCONTROL=ignoredups:erasedups  # no duplicate entries
export HISTSIZE=100000                   # big big history
export HISTFILESIZE=100000               # big big history
shopt -s histappend                      # append to history, don't overwrite it

# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"


在Mac OS X 10.5上使用bash 3.2.17进行了测试,在10.6上使用bash 4.1.7进行了测试。 />

评论


嗯。由于命令号会在每次提示时更改,因此这会破坏使用$!34的能力。是否有解决方法@Davide @Schof @kch?

–查尔斯·梅里亚姆
10 Mar 17 '10在19:33

使用它来获取无限的历史记录:bash永恒的历史记录。但是,这是对上面代码的补充,因为它不会自动重新加载。

–布兰登
2011-2-17在5:36

仅供参考,此处提到的解决方案都不能解决以下问题。我有两个shell窗口A和B。在shell窗口A中,我运行sleep 9999,在shell窗口B中(不等待睡眠完成),我希望能够在bash历史记录中看到sleep 9999。

–点
2011-03-25 13:43

@pts我也以实时行为为目标,但后来我意识到拥有终端特定的历史记录会更方便,因为这些历史记录使在不同终端中处理不同事情变得更加容易。我发现这非常有用:stackoverflow.com/questions/338285/#answer-7449399基于此,我给自己起了一个名为href的别名,该别名可立即刷新当前终端的历史记录并在此过程中清理历史记录文件。每当我打开新终端时,都会在我的bashrc文件中执行该清理/同步操作,因此新终端具有最新的历史记录。我将其与历史一起使用-a

–trusktr
2012年10月16日15:56



没有理由导出变量:您正在.bashrc中定义它们,因此它们将在每个shell中定义(即使在非交互式shell中也是如此,这也是浪费的)

–杜尔门
16年6月21日在14:44



#3 楼

这是我尝试的Bash会话历史记录共享。这将启用bash会话之间的历史记录共享,从而不会混淆历史记录计数器,并且可以像!number这样进行历史记录扩展(有一些限制)。 LTS(Lucid Lynx)。

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
    builtin history -a         #1
    HISTFILESIZE=$HISTSIZE     #2
    builtin history -c         #3
    builtin history -r         #4
}

history() {                  #5
    _bash_history_sync
    builtin history "$@"
}

PROMPT_COMMAND=_bash_history_sync


说明:


将刚输入的行追加到$HISTFILE(默认为.bash_history) 。这将导致$HISTFILE增长一行。
将特殊变量$HISTFILESIZE设置为某个值将导致Bash通过删除最旧的条目来将$HISTFILE截断为$HISTFILESIZE行以下。
清除历史记录运行会话。这将减少历史记录计数器$HISTSIZE的数量。
读取$HISTFILE的内容并将其插入到当前运行的会话历史记录中。这将使历史计数器增加$HISTFILE中的行数。请注意,$HISTFILE的行数不一定是$HISTFILESIZE
history()函数将覆盖内置历史记录,以确保在显示历史记录之前已对其进行同步。这对于按数字扩展历史记录是必需的(稍后将有更多信息)。

更多说明:


步骤1确保当前运行会话中的命令被写入全局历史记录文件。
步骤4确保将来自其他会话的命令读入当前会话历史记录。
由于步骤4将增加历史记录计数器,因此我们需要减少计数器某种程度上来说。这是在步骤3中完成的。
在步骤3中,历史记录计数器会减少$HISTSIZE。在第4步中,将历史计数器增加$HISTFILE中的行数。在第2步中,确保$HISTFILE的行数与$HISTSIZE完全相同(这意味着$HISTFILESIZE必须与$HISTSIZE相同)。

关于历史记录扩展的约束: />使用按数字扩展历史记录时,应始终在使用数字之前立即查找该数字。这意味着在查找数字和使用数字之间不会显示bash提示。通常,这意味着没有回车键,也没有ctrl + c。

通常,一旦您进行了多个Bash会话,就无法保证以数字扩展的历史记录将在两个Bash提示显示之间保留其值。 。因为当执行PROMPT_COMMAND时,来自所有其他Bash会话的历史记录会集成到当前会话的历史记录中。如果其他bash会话具有新命令,则当前会话的历史记录编号将不同。

我认为此约束合理。无论如何,我每次都必须查找该数字,因为我不记得任意的历史记录编号。

通常,我使用这样的历史记录扩展编号

$ history | grep something #note number
$ !number


我建议使用以下Bash选项。

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify


奇怪的错误:

运行通过管道传递到任何内容的history命令该命令将在历史记录中列出两次。例如:

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false


所有记录将在历史记录中列出两次。我不知道为什么。

改进的想法:


修改函数_bash_history_sync(),使其不会每次都执行。例如,它不应在提示符下CTRL+C之后执行。当我决定不执行该行时,我经常使用CTRL+C放弃一个长的命令行。有时我必须使用CTRL+C来停止Bash完成脚本。
当前会话中的命令应始终是当前会话历史中的最新命令。这也会带来副作用,即给定的历史记录号将保留此会话中的历史记录条目的值。


评论


为什么不使用“ history -n”(尚未加载的重新加载行)而不是“ history -c; history -r”?

–格雷厄姆
2011年9月14日20:40在

@Graham:我不想使用历史记录-n,因为它弄乱了历史记录计数器。另外,我发现历史记录-n太不可靠了。

– Lesmana
2011-09-16 12:02

缺点之一:具有多行字符串的命令通常仍保留在当前会话中。通过此技巧,它们可以立即分成几行。对-c -r使用-n不会有所帮助,cmdhist或lithist都不会。我认为目前尚无解决方法。

– Jo Liss
2012年2月1日在12:30

经过一番尝试之后,我实际上发现只运行历史记录-a而不使用-c和-r会更好地使用(尽管这不是问题所在)。这意味着您运行的命令即使在退出当前Shell之前也可以立即在新Shell中使用,而在同时运行的Shell中则不可用。这样,Arrow-Up仍然始终选择当前会话的上次运行命令,而我发现混乱很少。

– Jo Liss
2012年2月4日15:15

很好的答案,这与更常见的“ history -a; history -n”不同,它可靠地工作

– RichVel
13年1月12日在22:07

#4 楼

我不知道使用bash的任何方式。但这是zsh最受欢迎的功能之一。
我个人更喜欢zsh,而不是bash,所以我建议尝试一下。

这是我的.zshrc处理历史的部分:

SAVEHIST=10000 # Number of entries
HISTSIZE=10000
HISTFILE=~/.zsh/history # File
setopt APPEND_HISTORY # Don't erase history
setopt EXTENDED_HISTORY # Add additional data to history like timestamp
setopt INC_APPEND_HISTORY # Add immediately
setopt HIST_FIND_NO_DUPS # Don't show duplicates in search
setopt HIST_IGNORE_SPACE # Don't preserve spaces. You may want to turn it off
setopt NO_HIST_BEEP # Don't beep
setopt SHARE_HISTORY # Share history between session/terminals


评论


JFTR名称不区分大小写,下划线将被忽略。

– Pablo A
17-10-5在21:19

setopt EXTENDED_HISTORY就足够了

–安娜·玛丽亚·马丁内斯·戈麦斯(AnaMaríaMartínezGómez)
3月13日在22:40

#5 楼

为此,您需要在~/.bashrc中添加两行:

shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"


man bash起:


启用了histappend shell选项(请参阅下面的SHELL BUILTIN COMMANDS下的shopt的说明),这些行将附加到历史文件中,否则历史文件将被覆盖。


#6 楼

您可以编辑BASH提示符以运行Muerr建议的“ history -a”和“ history -r”:

savePS1=$PS1


(如果您弄乱了某些内容,几乎可以保证)

PS1=$savePS1`history -a;history -r`


(请注意,这是反引号;它们将在每个提示上运行历史记录-a和历史记录-r。因为它们不会输出任何文本,您的提示将保持不变。

一旦您以所需的方式设置了PS1变量,就将其永久设置为〜/ .bashrc文件。

如果您想在测试时返回到原始提示,请执行以下操作:

PS1=$savePS1


我已经对此进行了基本测试以确保它能正常工作,但不能在每次提示时都运行history -a;history -r产生任何副作用。

评论


kch的解决方案比我的解决方案更好。我现在在我的.bashrc中使用他的解决方案。

– Schof
09-10-13在22:28

#7 楼

如果您需要同时解决以下问题的bash或zsh历史记录同步解决方案,请参见http://ptspts.blogspot.com/2011/03/how-to-automatically-synchronize-shell.html

问题如下:我有两个外壳窗口A和B。在外壳窗口A中,我运行sleep 9999,并且在外壳窗口B中(无需等待睡眠完成),我希望能够看到bash历史记录中的sleep 9999

多数其他解决方案无法解决此问题的原因是,他们正在使用PROMPT_COMMANDPS1将它们的历史更改写入历史文件,这两个都正在执行为时已晚,仅在sleep 9999命令完成之后。

评论


这是一个很好的解决方案,但是我有几个问题。 1.我可以使用原始的.bash_history文件,我不想在$ HOME中存在另一个bash历史文件吗?2.也许您应该考虑为此设置一个github存储库。

– weynhamz
2012年8月15日上午10:23

似乎调试钩子与bashdb冲突,每次我启动bash会话时,都会遵循follow输出。 bash调试器bashdb,版本4.2-0.8版权所有2002、2003、2004、2006、2007、2008、2009、2010、2011 Rocky Bernstein这是免费软件,受GNU通用公共许可证保护,欢迎您使用。在某些条件下更改和/或分发其副本。 **内部调试错误_Dbg_is_file():文件参数null bash:_Dbg_filenames [$ fullname]:错误的数组下标```

– weynhamz
2012年8月15日上午10:28

@Techlive Zheng:1.故意不支持原始.bash_history,因为.merged_bash_history使用不同的文件格式,因此,如果.merged_bash_history无法正确加载,bash不会意外破坏累积的历史记录。设计稳健,将保持原样。 2.通常,github存储库是一个好主意,但是我没有时间为这个项目维护它,所以我没有这样做。 -是的,它与bashdb冲突,并且没有简单的解决方案(它们使用相同的钩子)。我不打算进行修复,但是我接受补丁。

–点
2012年8月15日上午10:45

好的谢谢你。我想出了一个更简单,更好的方法。

– weynhamz
2012年8月17日9:33

@TechliveZheng:能否与我们分享您简单,更好的解决方案,以便我们都能从中学习? (如果是这样,请为问题添加答案。)

–点
2012年8月17日12:21

#8 楼

是的,所以最后这使我很烦恼,找到了一个不错的解决方案:不了解您为什么要在每次命令后重新加载全局历史记录。我很少关心其他终端会发生什么,但是我总是在一个终端上运行一系列命令,例如:

# Write history after each command
_bash_history_append() {
    builtin history -a
}
PROMPT_COMMAND="_bash_history_append; $PROMPT_COMMAND"


(简化示例)

在另一个地方:

make
ls -lh target/*.foo
scp target/artifact.foo vm:~/


我也不想共享命令

评论


您在每个命令后重新加载历史记录的原因是它是问题所要求的行为(因此,这实际上并不能回答所提出的问题)。

–迈克尔·荷马
15年7月23日在9:42

@MichaelHomer公平点。可以随意投票以使答案始终排在最底层,但是,我会将此归咎于OP,但并没有意识到所请求的行为将有多糟糕,并且这是一个非常容易质疑的问题。

–Yarek T
2015年7月23日在10:46



是的,是的,这是一个公平的妥协。我的主要抱怨是我正在失去历史。即使这并不意味着在同时进行的会话中进行即时更新,也应以此为限。

–奥利
15年7月23日在12:44

#9 楼

您可以使用history -a将当前会话的历史记录追加到历史文件中,然后在其他终端上使用history -r读取历史文件。

#10 楼

这是我使用的替代方法。这很麻烦,但是它解决了@axel_c提到的问题,有时您可能希望在每个终端中有一个单独的历史记录实例(一个用于make,一个用于监视,一个用于vim,等等)。

我保留了一个单独的附加历史文件,并不断更新。我将以下内容映射到热键:

history | grep -v history >> ~/master_history.txt


这会将当前终端的所有历史记录追加到主目录中名为master_history.txt的文件中。

我还有一个单独的热键可以搜索主历史文件:

cat /home/toby/master_history.txt | grep -i


我使用cat | grep,因为它将光标留在末尾以输入我的正则表达式。一个不太丑陋的方法是在您的路径中添加几个脚本来完成这些任务,但是热键可以满足我的目的。我还将定期从我工作过的其他主机上提取历史记录,并将该历史记录附加到我的master_history.txt文件中。

能够快速搜索并找到您使用的棘手的正则表达式或7个月前提出的奇怪的perl单行代码总是很高兴的。

#11 楼

我可以为最后一个问题提供一个解决方法:确保env变量HISTCONTROL没有指定“ ignorespace”(或“ ignoreboth”)。在bash中根本无法很好地处理它。

#12 楼

这是我对@lesmana答案的增强。主要区别在于并发窗口不共享历史记录。这意味着您可以继续在窗口中工作,而不必将其他窗口的上下文加载到当前窗口中。

如果您明确键入“ history”,或者如果您打开一个新窗口,则可以

此外,我使用这种策略来存档计算机上曾经键入的每个命令。

# Consistent and forever bash history
HISTSIZE=100000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
}

_bash_history_sync_and_reload() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

history() {                  #5
  _bash_history_sync_and_reload
  builtin history "$@"
}

export HISTTIMEFORMAT="%y/%m/%d %H:%M:%S   "
PROMPT_COMMAND='history 1 >> ${HOME}/.bash_eternal_history'
PROMPT_COMMAND=_bash_history_sync;$PROMPT_COMMAND


#13 楼

我选择将历史记录放入每个tty文件中,因为多个人可以在同一服务器上工作-分开每个会话的命令可以更轻松地进行审核。

# Convert /dev/nnn/X or /dev/nnnX to "nnnX"
HISTSUFFIX=`tty | sed 's/\///g;s/^dev//g'`
# History file is now .bash_history_pts0
HISTFILE=".bash_history_$HISTSUFFIX"
HISTTIMEFORMAT="%y-%m-%d %H:%M:%S "
HISTCONTROL=ignoredups:ignorespace
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=5000


历史现在看起来像:

user@host:~# test 123
user@host:~# test 5451
user@host:~# history
1  15-08-11 10:09:58 test 123
2  15-08-11 10:10:00 test 5451
3  15-08-11 10:10:02 history


文件看起来像:

user@host:~# ls -la .bash*
-rw------- 1 root root  4275 Aug 11 09:42 .bash_history_pts0
-rw------- 1 root root    75 Aug 11 09:49 .bash_history_pts1
-rw-r--r-- 1 root root  3120 Aug 11 10:09 .bashrc


#14 楼

在这里,我将指出
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"



PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"


的一个问题。 bashrc,$ PROMPT_COMMAND就像

"history -a; history -c; history -r history -a; history -c; history -r"




"history -a; history -n history -a; history -n"


每次运行时都会重复'来源〜/ .bashrc'。每次运行“ source〜/ .bashrc”后,都可以通过运行“ echo $ PROMPT_COMMAND”来检查PROMPT_COMMAND。

您可能会看到一些命令似乎已损坏:“ history -n history -a”。但是好消息是它仍然有效,因为其他部分仍然形成了有效的命令序列(由于重复执行一些命令,因此涉及一些额外的费用。而且不是那么干净。)

我个人使用以下简单版本:

shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r"


具有大多数功能,而没有上述问题。

还有一点要说:真的没什么魔术。
PROMPT_COMMAND只是一个普通的bash环境变量。在收到bash提示($符号)之前,将执行其中的命令。例如,您的PROMPT_COMMAND是“ echo 123”,并且您在终端中运行“ ls”。效果就像运行“ ls; echo 123”。

$ PROMPT_COMMAND="echo 123"


输出(就像运行'PROMPT_COMMAND =“ echo 123”; $ PROMPT_COMMAND'一样):

123


运行以下命令:

$ echo 3


输出:

3
123


“ history -a”用于将内存中的历史记录命令写入〜/ .bash_history

“ history -c”用于清除内存中的历史记录命令

“ history -r”用于从〜/ .bash_history读取历史命令到内存

在此处查看历史命令说明:http://ss64.com/bash/history.html

PS:正如其他用户所指出的,导出是不必要的。请参阅:在.bashrc中使用export

#15 楼

我编写了一个脚本,用于根据以下内容为每个会话或任务设置历史记录文件。

        # write existing history to the old file
        history -a

        # set new historyfile
        export HISTFILE=""
        export HISET=

        # touch the new file to make sure it exists
        touch $HISTFILE
        # load new history file
        history -r $HISTFILE


它不必保存每个历史记录命令,但可以保存我关心的那些,然后通过每个命令更容易检索它们。我的版本还列出了所有历史记录文件,并提供了全部搜索功能。

完整源代码:https://github.com/simotek/scripts-config/blob/master/hiset.sh

#16 楼

这是一种解决方案,不会混淆各个会话的历史记录!

基本上,必须将每个会话的历史记录分别存储并在每个提示上重新创建它。是的,它使用了更多的资源,但并没有听起来那么慢-仅当您有超过100000个历史条目时,延迟才开始显着。

这是核心逻辑:

# on every prompt, save new history to dedicated file and recreate full history
# by reading all files, always keeping history from current session on top.
update_history () {
  history -a ${HISTFILE}.$$
  history -c
  history -r
  for f in `ls ${HISTFILE}.[0-9]* | grep -v "${HISTFILE}.$$$"`; do
    history -r $f
  done
  history -r "${HISTFILE}.$$"
}
export PROMPT_COMMAND='update_history'

# merge session history into main history file on bash exit
merge_session_history () {
  cat ${HISTFILE}.$$ >> $HISTFILE
  rm ${HISTFILE}.$$
}
trap merge_session_history EXIT


请参阅此要点,以获取完整的解决方案,包括一些防护措施和性能优化。

#17 楼

适用于ZSH

##############################################################################
# History Configuration for ZSH
##############################################################################
HISTSIZE=10000               #How many lines of history to keep in memory
HISTFILE=~/.zsh_history     #Where to save history to disk
SAVEHIST=10000               #Number of history entries to save to disk
#HISTDUP=erase               #Erase duplicates in the history file
setopt    appendhistory     #Append history to the history file (no overwriting)
setopt    sharehistory      #Share history across terminals
setopt    incappendhistory  #Immediately append to the history file, not just when a term is killed


评论


不幸的是,这个问题严格来说是bash :-)

–贾利克斯
17年7月24日在20:58

当我也搜索zsh时,它是google上的第一个结果。

–Mulki
17年7月25日在2:48

您应该提出一个新问题,〜“在多个终端窗口中保留zsh历史记录”,并假设一个尚不存在。如果这是一个好问题,则完全可以(甚至可以鼓励)回答您自己的问题。

–奥利
17年7月25日在8:29



#18 楼

我一直很想这样做,特别是希望能够通过在新项目中重新执行命令的位置来检索命令(或通过命令查找目录)。因此,我将这个工具放在一起,将以前存储全局CLI历史记录的解决方案与称为percol(映射到C ^ R)的交互式grepping工具结合在一起。在我开始使用它的第一台计算机上,它仍然很光滑,现在具有超过2年的CLI历史记录。

就箭头键而言,它与本地CLI历史记录没有什么区别,但是让您可以轻松访问全局历史记录(也可以将其映射到C ^ R以外的内容)

评论


这是给zsh的吗?

– sjas
19 Mar 17 '19 at 13:35

是的,我最初是为zsh制作的。虽然它也适用于bash和鱼。让我知道它是否有效。我已经有一段时间没有更改它了,我不确定我的安装说明中有多清晰

–戈登·威尔斯
19年3月18日在20:33

#19 楼

因为我更喜欢保存在自定义文件中的无限历史记录。我基于https://stackoverflow.com/a/19533853/4632019创建此配置:

export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "

export HISTFILE=~/.bash_myhistory
PROMPT_COMMAND="history -a; history -r; $PROMPT_COMMAND"


#20 楼

虽然我喜欢能够在终端之间(尤其是新终端)之间共享历史记录。我不想共享每一个发生的命令,因为一个窗口通常在执行一项特定任务,而与其他窗口分开。我希望它们在shell退出时或在我请求时合并。
很长一段时间以来,我一直在寻找一种方法来合并bash历史记录(带有时间戳),但我觉得似乎没有什么可以接受的。我只是“硬着头皮”,然后DIY了一个脚本以将磁盘“ .bash_history”与内存外壳“ history”合并。保留时间戳顺序和这些时间戳内的命令顺序。
现在,当我获取此时间戳(您可以将其设为别名或所需的函数)时,我将使用别名'hc'。我当前的Shell会话在磁盘和内存之间进行了合并,因此在需要时(或通过“ .bash_logout”从该Shell注销时),历史记录是从其他先前的合并中更新的。多行),和/或根据定义的perl RE删除(清除)简单和/或敏感的命令。调整以适合!
这就是结果... https://antofthy.gitlab.io/software/history_merge.bash.txt
享受。

#21 楼

这是我的.bashrc中的代码片段,并在需要时提供了简短说明: />

#22 楼

这不完全是问题的答案,或者是。这取决于你怎么看了。显然,bash不支持此功能。如果您考虑一下,这并非没有原因。为了实现这一点,它必须在执行每个命令之前写入历史文件(同时保持不重复),并在每次需要历史时读取。您认为文件仍然足够吗?好吧,您可能使用了锁,但是考虑到将按顺序进行一些索引,仅使用某种数据库必须更容易。最重要的是,您真的希望所有的炮弹都具有共同的历史吗?您是否不使用Up从当前Shell重新执行命令?不使用sudo !!吗?
所以我建议使用KISS(实用):
shopt -s histappend
HISTCONTROL=erasedups

要在另一个shell中执行命令时,请先执行history -a,然后再在另一个shell中执行history -n,而且你走的很好。