Вы говорите креативно и привлекательно? OK:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Брось это .bashrc
и иди. При этом используются сигналы, чтобы каждый bash
процесс проверял наличие новых записей в истории при выходе другого. Это довольно ужасно, но это действительно работает.
Как это работает?
trap
устанавливает обработчик сигнала для системного сигнала или одного из внутренних событий Bash. EXIT
Событие любое контролируемое прекращение оболочки, в то время как USR1
это SIGUSR1
, бессмысленный сигнал мы присваивая.
Всякий раз, когда оболочка выходит, мы:
- Добавить всю историю в файл явно.
- Отключите
SIGUSR1
обработчик и заставьте эту оболочку игнорировать сигнал.
- Отправьте сигнал всем запущенным
bash
процессам от одного и того же пользователя.
Когда SIGUSR1
прибывает, мы:
- Загрузите все новые записи из файла истории в список истории оболочки в памяти.
Из-за способом Баша ручки сигналов, не будет на самом деле получить новые данные истории , пока вы не попали Enterв следующий раз, так что это не делает лучше на этом фронте , чем положить history -n
в PROMPT_COMMAND
. Тем не менее, он сохраняет чтение файла постоянно, когда ничего не происходит, и запись вообще не происходит, пока оболочка не выйдет.
Однако здесь есть еще пара вопросов. Во-первых, ответом по умолчанию SIGUSR1
является завершение оболочки. Любые другие bash
процессы (например, запуск сценариев оболочки) будут уничтожены. .bashrc
не загружается неинтерактивными оболочками. Вместо этого загружается файл с именемBASH_ENV
: вы можете установить эту переменную в вашей среде глобально, чтобы указывать на файл с помощью:
trap '' USR1
в нем игнорировать сигнал в них (что решает проблему).
Наконец, хотя это и делает то, что вы просили, заказ, который вы получите, будет немного необычным. В частности, биты истории будут повторяться в разных порядках по мере их загрузки и сохранения отдельно. Это, по сути, присуще тому, что вы просите, но имейте в виду, что история со стрелкой вверх становится намного менее полезной на данном этапе. Тем не менее, подстановки истории и тому подобное будут распространяться и работать хорошо.