Творчі та залучаючі сигнали, скажете ви? ДОБРЕ:
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
встановлює обробник сигналу або для системного сигналу, або для одного з внутрішніх подій Баша. EXIT
Подія будь контрольоване припинення оболонки, в той час як USR1
це SIGUSR1
, безглуздий сигнал ми привласнюючи.
Щоразу, коли оболонка виходить, ми:
- Додайте всю історію до файлу явно.
- Вимкніть
SIGUSR1
обробник і змусьте цю оболонку ігнорувати сигнал.
- Відправте сигнал усім запущеним
bash
процесам від одного і того ж користувача.
Коли SIGUSR1
прибуває, ми:
- Завантажте всі нові записи з файлу історії до списку історії оболонки оболонки.
Через способом Баша ручки сигналів, що не буде на самому ділі отримати нові дані історії , поки ви не потрапили Enterв наступний раз, так що це не робить краще на цьому фронті , ніж покласти history -n
в PROMPT_COMMAND
. Він зберігає читання файлу постійно, коли нічого не сталося, і взагалі немає запису, поки оболонка не вийде.
Однак тут є ще пара питань. Перший полягає в тому, що відповідь за замовчуванням на SIGUSR1
- це припинення оболонки. Будь-які інші bash
процеси (наприклад, запущені сценарії оболонки) будуть знищені. .bashrc
не завантажується неінтерактивними оболонками. Натомість завантажується файл, названий користувачемBASH_ENV
: ви можете встановити цю змінну у вашому оточенні глобально, щоб вказувати на файл за допомогою:
trap '' USR1
в ньому ігнорувати сигнал в них (що вирішує проблему).
Нарешті, хоча це робить те, про що ви просили, замовлення, яке ви отримаєте, буде дещо незвичним. Зокрема, біти історії будуть повторюватися в різних порядках, коли вони завантажуються та зберігаються окремо. Це по суті властиво тому, що ви просите, але пам’ятайте, що історія стрілки вгору стає набагато менш корисною в цей момент. Заміни історії та подібне поділяться і працюватимуть добре.