История 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/*

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

  • Apt-get update не работает: ошибки подписи / проверки
  • Как копировать выходные данные из удаленной команды в локальный буфер обмена?
  • Как сохранить диакритические знаки при использовании кросс-монтирующих дисков для Windows7 и Linux
  • Выполнение tcpdump удаленно при локальном захвате пакетов
  • Есть ли способ монтировать файл.tar.bz2 без его извлечения в файловую систему?
  • Какую файловую систему следует использовать между OSX и Linux
  • В консоли linux, как НЕ завершать вывод
  • HDD Power-Up в режиме ожидания: не вращаться
  • Запуск нескольких полноэкранных экземпляров Chrome на нескольких мониторах из (пакетного) сценария
  • Переместить Grub на другой диск
  • меньше - больше? Чем меньше? я весьма озадачен
  • Interesting Posts

    Как получить права администратора после того, как я отключил все учетные записи администратора на своем компьютере

    Лучший способ организовать много-много медиа-файлов?

    Есть ли способ изменить направление текста и * символ * в чисто текстовом документе?

    Какова цель flush () в streamах Java?

    Компьютер не загружается, показывает ошибку PXE и ​​/ или «операционная система не найдена», «нет загрузочного устройства», «вставить загрузочный носитель» или другую аналогичную ошибку

    Могу ли я контролировать, кто использует мой Mac OS X Internet Sharing?

    Кэш запроса ARP для получения идентификатора MAC

    Как определить ширину экрана в терминах dp или dip во время выполнения в Android?

    Как я могу использовать / создать динамический шаблон для компиляции динамического компонента с угловым 2.0?

    Преобразование Firewire в USB 3 – теоретически возможно?

    Как проверить состояние внешнего USB-накопителя?

    Проверка файлов на внешнем диске на весь компьютер для дубликатов

    Когда использовать MyISAM и InnoDB?

    Постоянное соединение с БД – да или нет?

    Как отправить уведомление устройства на устройство с помощью FCM без использования XMPP или любого другого скрипта.?

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