Сохранение истории Bash из нескольких Konsole не работает правильно

9

Я использую несколько терминалов Konsole. И я хочу, чтобы все команды, которые я набираю на каждом терминале, были сохранены в истории команд, чтобы в следующей открытой консоли все они были. Чтобы запретить каждому терминалу перезаписывать историю команд другого терминала, я дал следующие настройки в моем.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

Я дал последнюю строку, чтобы увидеть номер команды в моем приглашении. Команда № никогда не превышал 600, но некоторые из моих старых команд исчезают из истории. Есть много команд, которые даются повторно, но, как и следовало ожидать ignoredups, никогда не увеличивает команду no in prompt. Все же старые команды все еще исчезают. И количество команд в истории всегда остается чуть больше 500.

.bash_historyФайл по- прежнему содержит много дублей, несмотря на ignoredups.

PS: вывод эха $HISTSIZEи $HISTFILESIZEоба=1000


Обновление: я обнаружил проблему в записи выше .bashrc. Просто позвонив history -aв PROMPT_COMMANDпросто дописывает последнюю новую команду к .bash_history. Так что ignoredupsи не erasedupsимеют никакого эффекта.

Есть ли способ, я все еще могу писать в .bash_history без дубликатов из каждого терминала? Я не хочу загружать всю историю в каждой командной строке history -rи снова записывать ее обратно history -w, потому что команды, которые я дал в одном терминале, появятся и в другом параллельно работающем терминале. Я хочу, чтобы объединенные команды появлялись только в новом терминале.

Загадка, почему моя история была урезана до 500, решена. Я заметил, что это происходит каждый раз, когда я захожу в эту машину. Создание .bash_profileсо следующей записью решило эту проблему.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

Теперь мой .bashrc выполняется каждый раз, когда я тоже ssh. И размер файла истории теперь монотонно увеличивается.

indiajoe
источник
Это то, что вы после? unix.stackexchange.com/questions/1288/…
jasonwryan
Я хочу избежать второго требования в списке Оли. Я не хочу, чтобы история моего другого терминала была перепутана. Пока я не начну новый терминал. Это то, что естественно происходит, когда я правильно выключаю свою машину. Но иногда правильное отключение невозможно, и если я не сохраню историю мгновенно, все будет потеряно при внезапном отключении питания.
indiajoe
Похоже на вопрос, возникший вbug-bash списке рассылки через год после его публикации
syntaxerror

Ответы:

1

Я пришел к выводу, что невозможно добавлять новые команды напрямую и одновременно удалять любые дубликаты. Поэтому мое решение состоит в том, чтобы запустить следующие команды через некоторое время. или положить его в мой crontab.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

Приведенная выше команда сохранит последнее вхождение команды и удалит все остальные повторения над ней из файла истории, не испортив порядок.

indiajoe
источник
0

Это уродливо, и я уверен, что sedили awkбудет лучше, но я попытался решить ту же проблему, добавив это в мой .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

Это создаст отдельный файл истории для каждого терминала, который вы открываете, однако если вы запустите bash в bash, он будет использовать ту же историю, но не должен перезаписывать. Я предупрежу вас с оговоркой из моего опыта. Хотя это работает и предотвращает перезапись истории, вам нужно иметь grepнесколько файлов, чтобы попытаться найти нужную историю, которая иногда может занимать много времени.

умебоши
источник