Творчі та залучаючі сигнали, скажете ви? ДОБРЕ:
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
в ньому ігнорувати сигнал в них (що вирішує проблему).
Нарешті, хоча це робить те, про що ви просили, замовлення, яке ви отримаєте, буде дещо незвичним. Зокрема, біти історії будуть повторюватися в різних порядках, коли вони завантажуються та зберігаються окремо. Це по суті властиво тому, що ви просите, але пам’ятайте, що історія стрілки вгору стає набагато менш корисною в цей момент. Заміни історії та подібне поділяться і працюватимуть добре.