![сохранять историю bash, регулярно](https://rvso.com/image/1330221/%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D1%8F%D1%82%D1%8C%20%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8E%20bash%2C%20%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE.png)
Я настроил bash на сохранение истории в файл. Он делает это всякий раз, когда bash завершает работу [правильно]. Поскольку иногда bash не завершает работу должным образом, история теряется.
Итак, вопрос в том, могу ли я настроить bash на более регулярное сохранение истории?
Я использую Debian Gnu (версия 6, Squeeze) с ядром Linux.
версия bash: GNU bash, версия 4.1.5(1)-release (i486-pc-linux-gnu)
решение1
сохраните это в вашем bash_profile или bashrc
shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
решение2
Я решил использовать export PROMPT_COMMAND='history -a'
в своем .bash_aliases, который записывает из списка истории в памяти в файл истории при каждом запросе. У меня были некоторые проблемы с дедупликацией, но они были решены. Я также прибегнул к использованию cron.daily и monthly для резервного копирования файла. Если терминал прерывается без выхода, он не будет сохранен. Даже перехват выхода не сработает. К сожалению, задание cron также не может сохранить список истории, который хранится в памяти. Я не смог найти способ отправить команду текущей запущенной оболочке для записи history -w
из списка в файл. Это можно было бы использовать, но для каждой оболочки, открытой на вкладке, пришлось бы сделать отдельную, если бы кто-то хотел разделить работу. Если нет, есть другая ссылка, в которой обсуждается, как писать в каждом запросе, одновременно выполняя дедупликацию.
решение3
Возможно, ваш $HISTFILE принадлежит пользователю root. Предполагая, что вы используете bash в качестве оболочки входа. Вот как это проверить:
$ [ -z $HISTFILE ] && echo need to set HISTFILE || ls -l $HISTFILE
-rw------- 1 root root 36639 May 21 19:48 /home/joeb/.bash_history
Значением по умолчанию для HISTFILE должно быть ~/.bash_history. Если вы видите ошибку «need to set HISTFILE» или если $HISTFILE не равен ~/.bash_history, то вам следует проверить ~/.profile или ~/.bash_profile или ~/.bashrc, чтобы убедиться, что он не устанавливается или не сбрасывается неправильно.
Обычно им владеет только пользователь root, поэтому просто сбросьте его:
$ chown joeb.joeb $HISTFILE
$ ll $HISTFILE
-rw------- 1 joeb joeb 36639 May 21 19:48 /home/joeb/.bash_history
Выйдите из системы, затем войдите снова.
$ history
Должен отображаться последний набор команд, введенных до того, как владельцем файла стал пользователь root, а затем команды, введенные после смены владельца файла.