6

ではUbuntu、いくつかのターミナルを開いているときに、現在のセッションを閉じて新しいセッションを開くたびに、それらのターミナルで入力されたコマンドの履歴が表示されませんhistory。そのような端末の履歴が 1 つだけ表示されます。

正確には何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

より多くのハックについては、この素晴らしい履歴ガイドをご覧ください: The Definitive Guide to Bash Command Line History . そこにhistappendは、hek2mgl によってコメントされたパラメーターの詳細も記載されています。

オプション 'histappend' は、履歴リストが HISTFILE に書き込まれる方法を制御します。オプションを設定すると、現在のセッションの履歴リストが HISTFILE に追加されます。設定を解除すると (デフォルト)、HISTFILE が毎回上書きされます。

たとえば、このオプションを設定するには、次のように入力します。

$ shopt -s histappend

設定を解除するには、次のように入力します。

$ shopt -u histappend
于 2013-02-12T14:38:07.437 に答える
3

ここで概説されているアプローチを使用しています

基本的に、python を使用してsets、すべてのシェルに入力されたすべてのコマンドの一意のリストを処理します。結果は に格納され.my_historyます。このアプローチを使用すると、開いているすべてのシェルで入力されたすべてのコマンドが、他のすべてのシェルですぐに使用できるようになります。すべて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 に答える