По какой-то причине я не могу заставить мою систему сохранять историю BASH после перезагрузки. Вот соответствующие разделы моего ~/.bashrc
:
shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"
Насколько я могу судить, это все необходимые опции (я знаю, что раньше у меня была возможность вести историю по нескольким перезагрузкам без всего этого в прошлом). Однако, несмотря на добавление этих параметров несколько перезагрузок назад, я все еще теряю большую часть своей истории после перезагрузки. Он не пустой, но в нем нет 9999 строк, которые были у меня до перезагрузки.
Прежде чем кто-то пожалуется, да, я прочитал эти вопросы. Я реализовал некоторые из их предложений, перечисленных выше, остальные были либо бесполезны, либо не актуальны:
- Потеря истории Bash при использовании histappend
- Как не дать Bash изменить историю?
- Что определяет, что появляется в команде bash history?
- Как мне сохранить историю bash между сеансами?
- сохранить историю Bash, регулярно
Если у вас есть другие важные команды, вы можете посмотреть все мои ~/.bashrc
здесь .
Итак, что мне не хватает? Почему моя история не сохраняется? Если кто-то считает, что другой файл может быть уместным, дайте мне знать, и я опубликую его. Я проверил, запустив grep -i hist \.*
мой, $HOME
который показал, что единственный соответствующий .
файл, содержащий строку hist
или HIST
был .bashrc
.
Я использую Linux Mint Debian Edition, GNU bash, версия 4.2.36 (1) -релиз (x86_64-pc-linux-gnu) и мой любимый эмулятор терминала (в случае необходимости) terminator
.
ОБНОВИТЬ:
Следуя предложению @ mpy в комментариях, я изменил свой ~/.bashrc
на set HISTFILE=~/bash_history
в отличие от значения по умолчанию, ~/.bash_history
и это, похоже, решает проблему для интерактивных оболочек . Оболочки входа в систему по-прежнему отображают то же поведение, при этом история усекается в 500
строках. Однако HIST
в соответствующих файлах нет связанных переменных:
$ for f in /etc/profile ~/.profile ~/.bash_profile ~/.bash_login; do \
echo -ne "$f :"; echo `grep HIST $f`; \
done
/etc/profile :
/home/terdon/.profile :grep: /home/terdon/.profile: No such file or directory
/home/terdon/.bash_profile :grep: /home/terdon/.bash_profile: No such file or directory
/home/terdon/.bash_login :grep: /home/terdon/.bash_login: No such file or directory
$ grep -r HIST /etc/profile.d/ <-- returns nothing
Итак, почему настройки HISTSIZE
и HISTFILESIZE
in ~/.bashrc
недостаточно, если я явно не установил что- $HISTFILE
то отличное от значения по умолчанию ~/.bash_history
?
history
команду, вывод, который вы видите, идентичен тому, что вы видите, работаетcat .bash_history
, кроме номеров строк? Я имею в видуhistory
список команд отметки времени или другую информацию? Причина, по которой я спрашиваю, состоит в том, что, если вы видите эти эзотерические вещи, это означает, что есть другой модуль / функция / программа, которая работает с историей оболочки, и неправильная или ошибочная версия чего бы то ни было, может причинить вам горе ,;)
: попробуйте другой файл как HISTFILE, а не по умолчанию~/.bash_history
. Очень подробное объяснение: я предполагаю, что bash - это ваша оболочка по умолчанию, поэтому при запуске системы неинтерактивная оболочка является родителем вашей сессии X (я также предполагаю, что вы используете X), которая ничего не будет знать о параметре histappend (так как .bashrc только читать в интерактивных оболочках), так что до тех пор, пока эта родительская оболочка запускается, все в порядке, но после ее завершения (т.е. остановки системы) она будет переопределена~/.bash_history
(что по умолчанию) и испортит вашу историю ...Ответы:
Проблема на самом деле сводится к разному поведению оболочек входа и не входа в систему. Я установил переменные, которые контролируют историю в моем
~/.bahsrc
. Этот файл не читается при запуске оболочки входа в систему, он читается только интерактивными оболочками, не входящими в систему (изman bash
):Поэтому, каждый раз, когда я входил в систему, или сбрасывался в tty, или использовал ssh,
.history
файл урезался, потому что я также не установил в нем правильный размер~/.profile
. Я наконец понял это и просто установил переменные в том месте,~/.profile
где они принадлежат , вместо~/.bashrc
Итак, причина, по которой меня
~/.history
усекали, заключалась в том, что я установил переменные HISTORY только в файле, читаемом интерактивными оболочками, не входящими в систему, и, следовательно, каждый раз, когда я запускал оболочку другого типа, переменные игнорировались, а файл обрезался. соответственно.источник
.bashrc
не читается (неинтерактивные ИЛИ логин оболочки).export BASH_ENV=~/.bashrc ; if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
... и вверху ~ / .bashrc поставьте галочку, чтобы убедиться, что вы действительно работаете в интерактивном режиме:[ -z "$PS1" ] && return
... Конечно, это просто идиома.BASH_ENV
не имеет значения, он влияет только на неинтерактивные оболочки. Что касается «идиомы», то это то, что Debian начал и с которым я лично не согласен. У меня часто есть графические опции (xset
и тому подобное) в моем .bashrc, и я не хочу, чтобы они были активными, когда я запускаю оболочки входа в систему из tty или черезssh
. Я хочу, чтобы мои .profile и .bashrc разделились. Многие (хотя и не все) менеджеры входа в систему получают источник .profile, когда вы входите в систему, поэтому глобальные переменные лучше всего устанавливать там, где они будут считываться только один раз, а не каждый раз, когда вы открываете терминал.~/.profile
или~/.bashrc
) читаются последними. Все, что установлено в них, будет иметь приоритет над глобальными настройками. Вы совершенно правы, вы не должны устанавливать эти переменные в/etc/bash.bashrc
. Используйте~/.profile
(или~/.bash_profile
) вместо этого.Я предлагаю использовать другой файл как
HISTFILE
, а не по умолчанию~/.bash_history
.Хотя у меня нет аналитического объяснения, я попытаюсь обрисовать, что привело меня к этому предложению: если вы используете в
bash
качестве оболочки по умолчанию (login), а также используетеX
(что очень вероятно), у вас есть работающийbash
экземпляр сразу после (графического ) авторизоваться:Я думаю, что этот экземпляр является оболочкой входа в систему, поэтому он не читает вашу
~/.bashrc
и, следовательно, не будет ничего знать оhistappend
параметре:Пока эта «родительская оболочка» работает, все в порядке, но после ее завершения (т.е. остановки системы) она будет переопределена
~/.bash_history
(потому что это значение по умолчанию) и испортит вашу историю или обрезает ее при запуске системы (снова по умолчанию) 500 линий. (Или, возможно, оба ...)Меня также поражает, что недостаточно включить конфигурацию истории
~/.bashrc
, так как это не должно быть такой необычной установкой. У меня нет объяснения этому.Что касается вашей проблемы, что «Оболочки входа в систему по-прежнему отображают то же поведение», вы можете попробовать включить конфигурацию истории также в
~/.bash_profile
:К сожалению, я не могу опубликовать более обоснованное объяснение с подробностями из моего собственного
bash
конфига, так как яzsh
парень ...источник
~/.bash_profile
решила проблему. Я сейчас использую в~/.bash_history
качестве файла истории, но просто добавил все строки из~/.bashrc
показанного в моем вопросе~/.bash_profile
. Все еще не уверен, кто испортил интерактивные оболочки, но это, кажется, работает теперь, спасибо!Так как все ваши настройки в порядке в соответствии с man-страницей, а файл истории не ограничен размером (в байтах), я могу придумать единственное возможное объяснение. Это связано с тем, как умирает оболочка.
Согласно онлайн-справке, постепенный выход (сохраненная история) происходит только тогда, когда оболочка получает сигнал SIGHUP. Я не могу объяснить, как ваша система передает сигналы при перезагрузке, но я подозреваю, что ваша оболочка закрывается с SIGKILL или SIGPWR.
Это может быть потому, что ваш WM работает асинхронно (ожидание), и эмулятор терминала, порожденный от WM, где bash получает сигнал форсирования выхода, отличный от SIGHUP. Может также случиться так, что ОС должна быстро отправить «окончательное уничтожение» всем процессам, прежде чем начальному грациозному SIGHUP удастся добраться до оболочки через X -> WM -> xterm, возможно, потому что X или WM требует больше времени для выхода, чем требуется, чтобы ОС была готова к выходу из строя.
Я нахожусь в глубоких водах с этим материалом, но я думаю, что что-то в этом роде вызывает беспорядочное поведение. У меня была эта проблема раньше, и самое надежное средство
exit
в bash, где вы хотите сохранить историю.Я заметил
history -a
в вашем вопросе, и я не могу думать о том, почему этого было бы недостаточно, чтобы сохранить историю.Вы можете устранить проблему, выяснив, что действительно убивает ваш bash, и перейдя к выяснению источника сигнала и устранению проблемы, или просто сбросив историю, когда вы знаете, какой сигнал последний (если к тому времени диски все еще подключены) ):
Прилагаемый снимок экрана иллюстрирует то, о чем я говорю во втором и третьем абзацах. Последовательность, в которой я вхожу в оболочку слева , убивает левую оболочку справа и следит за историей.
человек баш
онлайн ссылка
демонстративный снимок экрана
источник
/tmp/pso
ты убиваешь? Я понимаю вашу точку зрения о различных сигналах убийства (хотя, как вы говорите, я подумал, что это то, с чемhistory -a
нужно иметь дело). Я проверю это некоторое время и сообщу.Проверьте / etc / profile и /etc/profile.d/*
Может быть, там что-то не так с настройками истории.
источник
grep -r HIST /etc/profile.d/
ничего не возвращает, а я уже проверил/etc/profile
.