История BASH усечена до 500 строк при каждом входе в систему

По какой-то причине я не могу заставить мою систему сохранять историю 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?
  • Как сохранить историю bash во всех сессиях?
  • Сохранить историю bash, регулярно

В случае непредвиденных обстоятельств там могут быть другие соответствующие команды, здесь вы можете просмотреть всю свою ~/.bashrc .

Итак, что мне не хватает? Почему моя история не спасена? Если кто-то думает, что другой файл может быть уместным, дайте мне знать, и я опубликую его. Я проверил, выполнив grep -i hist \.* В моем $HOME который показал, что это единственное релевантное . Файл, содержащий строку hist или HIST был .bashrc .

Я запускаю Linux Mint Debian Edition, GNU bash, версия 4.2.36 (1) -release (x86_64-pc-linux-gnu), и мой любимый эмулятор терминала (в случае, если это релевантно) является terminator .


ОБНОВИТЬ:

Следуя предложению @ mpy в комментариях, я изменил свой ~/.bashrc чтобы установить 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 в ~/.bashrc недостаточна, если я явно не установил значение $HISTFILE в значение, отличное от ~/.bash_history по умолчанию?

4 Solutions collect form web for “История BASH усечена до 500 строк при каждом входе в систему”

Проблема на самом деле сводится к различному поведению систем входа и не-входа. Я установил переменные, которые управляют историей в моем ~/.bahsrc . Этот файл не читается, когда вы запускаете оболочку входа в систему, он читается только интерактивными, не-регистрационными оболочками (от man bash ):

Когда bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром --login , она сначала считывает и выполняет команды из файла /etc/profile , если этот файл существует. После прочтения этого файла он ищет ~ / .bash_profile, ~/.bash_login и ~/.profile в этом порядке и считывает и выполняет команды из первого, который существует и доступен для чтения. Опция --noprofile может использоваться, когда оболочка начинает блокировать это поведение.

[. , , ]

Когда запущена интерактивная оболочка, которая не является оболочкой входа, bash считывает и выполняет команды из ~ / .bashrc, если этот файл существует. Это может быть заблокировано с помощью параметра –norc. Параметр файла -rcfile заставит bash читать и выполнять команды из файла вместо ~ / .bashrc.

Поэтому каждый раз, когда я вошел в систему или отбрасывался в tty или использовал ssh, файл .history был усечен, потому что я не установил его в нужный размер в ~/.profile . Я, наконец, понял это и просто установил переменные в ~/.profile где они принадлежат , вместо ~/.bashrc

Итак, причина, по которой моя ~/.history была усечена, состояла в том, что я только установил переменные HISTORY в файл, читаемый интерактивными оболочками без входа, и поэтому каждый раз, когда я запускал другой тип оболочки, переменные были бы проигнорированы, а Файл будет соответствующим образом разрезан.

Мое предложение – использовать другой файл как HISTFILE , а не default ~/.bash_history .

Хотя у меня нет аналитических объяснений, я попытаюсь описать, что привело меня к этому предложению: если вы используете bash как свою стандартную (login) оболочку, а также используете X (что очень вероятно), у вас есть запущенный экземпляр bash сразу после (Графический) логин:

 systemd ... |-login | `-bash <<==== | `-slim | |-X -nolisten tcp vt07 -auth /var/run/slim.auth | | `-{X} | `-fluxbox | `-xterm -bg black -fg white | `-bash ... 

Я думаю, что этот экземпляр является оболочкой входа, поэтому он не читает ваш ~/.bashrc и, следовательно, ничего не знает о опции histappend :

Man bash (1) : Когда запущена интерактивная оболочка, которая не является оболочкой входа , bash считывает и выполняет команды из /etc/bash.bashrc и ~ / .bashrc, если эти файлы существуют. (…)

Пока эта «родительская оболочка» работает, все нормально, но после ее завершения (т. Е. Остановки системы) она переопределит ~/.bash_history (потому что это значение по умолчанию) и испортит вашу историю или запишет ее при запуске системы ( Снова по умолчанию) 500 строк. (Или, возможно, оба …)

Мне также кажется, что недостаточно включить конфигурацию истории в ~/.bashrc , поскольку это не должно быть такой необычной настройкой. У меня нет объяснений.


Что касается вашей проблемы, то, что «в оболочках входа по-прежнему отображается одинаковое поведение», вы можете попытаться включить конфигурацию истории также в ~/.bash_profile :

Man bash (1) : Когда bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром –login, она сначала считывает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~ / .bash_profile, (…)

К сожалению, я не могу опубликовать более обоснованное объяснение с деталями из моей собственной конфигурации bash , так как я парень zsh

Поскольку все ваши настройки находятся в соответствии с man-страницей, и поскольку файл истории не ограничен размером (байтами), это единственное возможное объяснение, о котором я могу думать. Это связано с тем, как раковина умирает.

Согласно онлайн-ссылке, изящный выход (сохранение истории) происходит только тогда, когда оболочка получает SIGHUP. Я не могу объяснить, как ваша система распространяет сигналы при перезагрузке, но я подозреваю, что ваша оболочка завершает работу с SIGKILL или SIGPWR.

Это может быть связано с тем, что ваш WM запускается асинхронно (подождите), и эмулятор терминала генерируется из WM, где bash получает сигнал выхода, отличный от SIGHUP. Также может случиться так, что ОС быстро отправит «окончательное убийство» ко всем процессам до того, как исходный изящный SIGHUP сумеет добраться до оболочки через X -> WM -> xterm, возможно потому, что X или WM занимает больше времени для выхода, чем Требуется, чтобы ОС была готова к работе.

Я нахожусь в глубоких водах с этим материалом, но я думаю, что что-то в этом роде вызывает неустойчивое поведение. Раньше у меня была эта проблема, и самым твердым средством является exit в bash, где вы хотите сохранить историю.

Я заметил history -a в вашем вопросе, и я не могу придумать, почему этого недостаточно, чтобы сохранить историю.

Вы можете устранить проблему, выяснив, что на самом деле убивает ваш bash, и перейдя к выяснению того, откуда возникает сигнал, и исправляя проблему там, или просто очистите историю, когда вы знаете, какой сигнал является последним (при условии, что диски все еще доступны к тому времени ):

 trap "echo got 1 >/tmp/sig1; exit" SIGHUP trap "echo got 2 >/tmp/sig2; exit" SIGINT trap "echo got 15 >/tmp/sig15; exit" SIGTERM .. and so on... 

Включенный снимок экрана иллюстрирует то, о чем я говорю во втором и третьем абзацах. Последовательность есть I shell слева , убить левую оболочку справа и cat историю.

Человек бах

При запуске (…) Файл, названный значением HISTFILE, усекается, если необходимо, содержать не более количества строк, заданных значением HISTFILESIZE (+ значение по умолчанию 500).

Если опция оболочки histappend включена (+ по умолчанию здесь), строки добавляются в файл истории, иначе файл истории будет перезаписан.

Онлайн-ссылка

3.7.6 Сигналы

Когда Bash является интерактивным, в отсутствие каких-либо ловушек, он игнорирует SIGTERM (так что «kill 0» не убивает интерактивную оболочку), а SIGINT поймается и обрабатывается (так, что wait builtin прерывается). Когда Bash получает SIGINT, он вырывается из любых циклов выполнения. Во всех случаях Bash игнорирует SIGQUIT. Если управление заданиями действует (см. «Управление заданиями»), Bash игнорирует SIGTTIN, SIGTTOU и SIGTSTP.

Нестроенные команды, запущенные Bash, имеют обработчики сигналов, установленные для значений, унаследованных оболочкой от ее родителя. Когда управление заданиями не действует, асинхронные команды игнорируют SIGINT и SIGQUIT в дополнение к этим унаследованным обработчикам. Команды запускаются в результате подстановки команд, игнорируя генерируемые клавиатурой сигналы управления работой SIGTTIN, SIGTTOU и SIGTSTP.

Оболочка выходит по умолчанию при получении SIGHUP. Перед выходом интерактивная оболочка отправляет SIGHUP во все задания, работает или останавливается. Остановленные задания отправляются SIGCONT для обеспечения получения SIGHUP. Чтобы оболочка не отправляла сигнал SIGHUP на конкретное задание, она должна быть удалена из таблицы заданий с отключенным встроенным (см. Раздел «Управление заданиями») или отмечена, чтобы не получать SIGHUP с помощью disown -h.

Если параметр оболочки huponexit был установлен с помощью shopt (см. Раздел «Создание Shopt»), Bash отправляет SIGHUP ко всем заданиям, когда выходит интерактивная оболочка входа.

Если Bash ожидает завершения команды и получает сигнал, для которого была установлена ​​ловушка, ловушка не будет выполняться до тех пор, пока команда не завершится. Когда Bash ожидает асинхронную команду через встроенный wait, прием сигнала, для которого установлен ловушка, приведет к тому, что wait builtin немедленно вернется с статусом выхода более 128, сразу после которого будет запущена ловушка.

Демонстрационный снимок экрана

сигналы

Проверьте / etc / profile и /etc/profile.d/*

Может быть, там что-то возится с историческими настройками.

  • Обратное мультиплексирование для ускорения передачи файлов
  • Линукс с двойной загрузкой с поддержкой виртуализации с универсальным доступом к папке / разделу данных
  • Можно ли подключить беспроводной маршрутизатор к другой точке доступа?
  • Могу ли я поменять CTRL и ALT в KDE?
  • Почему моя команда xmodmap не запускается при запуске / входе?
  • Ошибка загрузки PXE на предустановленную GRUB без сообщения об ошибке
  • Dkms не находит источник ядра
  • Используйте светодиод Caps Lock в качестве индикатора жесткого диска (или пользовательского)
  • Каков наилучший способ клонирования раздела Linux на меньший раздел?
  • Как узнать, какие процессы обращаются к жесткому диску в системе на основе GNU / Linux?
  • Скопируйте файлы в Linux, избегайте копирования, если файлы существуют в месте назначения
  • Interesting Posts

    Как клонировать одну ветвь в git?

    Bash: использовать столбцы отдельно в массиве

    WinXP: разница между Log Off и Restart

    Почему мой ноутбук Compaq NC8430 так чертовски горячий?

    Получить данные из ввода файла в JQuery

    Что означает символ @ перед именем переменной в C #?

    Коды статуса REST HTTP для неудачной проверки или неправильного дублирования

    Почему невозможно получить доход, появившийся внутри блока try с catch?

    Имя свойства объекта как число

    Преобразование разделенных запятыми строк ints в массив int

    Сравните одну строку с несколькими значениями в одном выражении

    Безопасно ли устанавливать внешний накопитель поверх моего рабочего стола возле жесткого диска?

    Общие коллекции PowerShell

    Будет ли параллельный порт-ключ работать на USB-параллельном адаптере?

    Как узнать, почему сбой на удалении файлов на Java?

    Давайте будем гением компьютера.