2013-02-12 2 views
3

В Ubuntu, когда у меня открыто несколько терминалов, я закрываю текущий сеанс и открываю новый, история команд, набранных этими терминалами, не будет отображаться с history. Появится история только одного такого терминала.История команд и использование нескольких терминалов

Что именно делает history отслеживать?

+2

взглянуть на переменную HISTCONTROL среды. Также сделайте 'shopt | grep hist' и google. На моем ubuntu (12.04) он работает как ожидалось – hek2mgl

+0

См. Http://unix.stackexchange.com/q/1288/9454 –

ответ

3

История сохраняется в файле, указанном HISTFILE. Вы можете найти информацию, хранящуюся в истории в руководстве истории (man history):

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

Для Баша обычно переменная HISTFILE устанавливаются в .bash_history, который является общим для всех оболочек.

Посмотрите этот хороший справочник по истории для большего количества хаков: The Definitive Guide to Bash Command Line History. Там вы можете найти также детали к параметру histappend комментариями hek2mgl:

Например, чтобы установить этот параметр, тип:

$ shopt -s histappend 

И UNSET его, типа:

$ shopt -u histappend 
2

Я использую подход, обозначенный here

В основном, он использует 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) 
Смежные вопросы