1

Постановка задачи

Я следовал за многочисленными примерами создания творческих вещей с историей bash по следующим направлениям:

# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'

... но это, казалось, работало с перерывами. Если файл истории уже существует с предыдущей историей, то все в порядке.

Другая важная информация

  • Версии bash: 3.2.51, 4.1.2 и 4.2.45
    • 4.2.x, похоже, не имеет этой проблемы, но это не установка по умолчанию
  • ОС: Linux и Solaris
  • домашний каталог NFS монтируется

Диагностические этапы

Я избавился от своего .bashrc и установил свой .bash_profile в:

HISTFILE=$HOME/.bash_history.test

Затем я запускаю оболочку входа (например, ssh на другую машину) и делаю что-то вроде следующего:

~ cat .bash_history.test
cat: .bash_history.test: No such file or directory
~ history
    1  cat .bash_history.test
    2  history
~ history -a
~ !-3
cat .bash_history.test
cat: .bash_history.test: No such file or directory

Файл истории не будет добавлен history -a при следующих обстоятельствах:

  • Файл не существует
  • Файл пуст или содержит только новые строки; даже пробел заставит это работать

... Однако, когда выходит из оболочки оно создает его. После этого history -a работает как положено ... за исключением случаев, когда PROMPT_COMMAND="history -a; history -c; history -r" . Когда у меня был этот набор, даже выход из оболочки не создавал файл истории (если я сначала не запустил exec bash ).

Затем я попытался с нестандартной установкой bash (4.2.x), и проблема не проявилась.

1 ответ1

1

Эта ветка списка рассылки, кажется, объясняет эти проблемы; цитата из 2-го сообщения:

Текущий код в bashhist.c: Maybe_append_history() (который существует как минимум 15 лет), по-видимому, не обрабатывает случай, когда количество строк истории в текущем сеансе равно количеству записей списка истории. То есть код не будет добавлять новые строки, если он не считает, что при запуске оболочки были прочитаны какие-либо строки из файла истории. Это кажется неправильным, и я приложил патч, который это исправляет. Тем не менее, код существует в его текущей форме так долго, что мне интересно, есть ли какая-то другая причина для этого.

(Чет Рами, список рассылки GNU bash)

Кроме того, список изменений для 4.2 имеет следующий текст:

+                  8/13
+                  ----
+bashhist.c
+   - in maybe_append_history, change check for history_lines_this_session
+     so that we append the lines to the file if it's equal to the value
+     returned by where_history().  This means that without this change,
+     the history won't be appended if all the lines in the history list
+     were added in the current session since the last time the history
+     file was read or written.  Fixes bug reported by Bruce Korb
+     <bruce.korb@gmail.com>

(git.savannah.gnu.org, bash git repo)

Очевидно, что для решения этой проблемы нам нужно установить более новую версию bash.

Надеюсь, это поможет кому-то еще в будущем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .