6

Ubuntu中,每当我打开几个终端时,我都会关闭当前会话并打开一个新会话,在这些终端中键入的命令的历史记录不会显示为history. 只有一个这样的终端的历史会显示出来。

究竟history要跟踪什么?

4

2 回答 2

6

历史记录存储在由 指定的文件中HISTFILE。您可以在历史手册(man history)中找到历史保存的信息:

typedef struct _hist_entry {
    char *line;
    char *timestamp;
    histdata_t data;
} HIST_ENTRY;

对于 bash,通常将变量HISTFILE设置.bash_history为所有 shell 通用的变量。

看看这个不错的历史指南以获得更多技巧: Bash 命令行历史的权威指南。在那里,您还可以找到histappendhek2mgl 注释的参数的详细信息:

选项 'histappend' 控制历史列表如何写入 HISTFILE,设置该选项会将当前会话的历史列表附加到 HISTFILE,取消设置(默认)将使 HISTFILE 每次都被覆盖。

例如,要设置此选项,请键入:

$ shopt -s histappend

要取消设置,请键入:

$ shopt -u histappend
于 2013-02-12T14:38:07.437 回答
3

我正在使用此处概述的方法

基本上,它使用 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)
于 2013-02-12T14:59:03.193 回答