在Ubuntu
中,每当我打开一些终端时,我关闭当前会话并打开一个新会话,在这些终端中键入的命令的历史记录不会显示{{1} }。只有一个这样的终端的历史将出现。
history
到底跟踪了什么?
答案 0 :(得分:4)
历史记录存储在HISTFILE
指定的文件中。
您可以在历史记录手册(man history
)中找到历史记录保存的信息:
typedef struct _hist_entry {
char *line;
char *timestamp;
histdata_t data;
} HIST_ENTRY;
对于bash,通常变量HISTFILE
设置为.bash_history
,这对所有shell都是通用的。
看看这个漂亮的历史指南,了解更多黑客攻击:
The Definitive Guide to Bash Command Line History。在那里,您还可以找到hek2mgl评论的histappend
参数的详细信息:
例如,要设置此选项,请键入:
$ shopt -s histappend
要取消设置,请输入:
$ shopt -u histappend
答案 1 :(得分:3)
我正在使用概述here
的方法基本上,它使用python和sets
来处理所有shell中输入的所有命令的唯一列表。结果存储在.my_history
中。使用此方法,在每个打开的shell中输入的所有命令都可立即在所有其他shell中使用。每个cd
都存储,因此文件有时需要手动清理,但我发现这种方法更适合我的需要。
以下必要的更新。
的.profile :
# 5000 unique bash history lines that are shared between
# sessions on every command. Happy ctrl-r!!
shopt -s histappend
# Well the python code only does 5000 lines
export HISTSIZE=10000
export HISTFILESIZE=10000
export PROMPT_COMMAND="history -a; unique_history.py; history -r; $PROMPT_COMMAND"
* unique_history.py *
#!/usr/bin/python
import os
import fcntl
import shutil
import sys
file_ = os.path.expanduser('~/.my_history')
f = open(file_, 'r')
lines = list(f.readlines())
f.close()
myset = set(lines)
file_bash = os.path.expanduser('~/.bash_history')
f = open(file_bash, 'r')
lines += list(f.readlines())
f.close()
lineset = set(lines)
diff = lineset - myset
if len(diff) == 0:
sys.exit(0)
sys.stdout.write("+")
newlist = []
lines.reverse()
count = 0
for line in lines:
if count > 5000:
break
if line in lineset:
count += 1
newlist.append(line)
lineset.remove(line)
f = open(file_, 'w')
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
newlist.reverse()
for line in newlist:
f.write(line)
fcntl.flock(f.fileno(), fcntl.LOCK_UN)
f.close()
shutil.copyfile(file_, file_bash)
sys.exit(0)