Kreatywne i angażujące sygnały, mówisz? DOBRZE:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Wrzuć to .bashrc
i idź. Wykorzystuje sygnały, aby kazać każdemu bash
procesowi sprawdzać nowe wpisy historii, gdy inny kończy działanie. To jest okropne, ale naprawdę działa.
Jak to działa?
trap
ustawia moduł obsługi sygnału dla sygnału systemowego lub jednego z wewnętrznych zdarzeń Basha. EXIT
Wydarzenie jest jakaś sterowana zakończenie skorupy, a USR1
to SIGUSR1
, bez znaczenia sygnał jesteśmy przywłaszczenia.
Za każdym razem, gdy powłoka wychodzi, my:
- Dodaj jawnie całą historię do pliku.
- Wyłącz
SIGUSR1
moduł obsługi i spraw, aby powłoka zignorowała sygnał.
- Wyślij sygnał do wszystkich uruchomionych
bash
procesów od tego samego użytkownika.
Kiedy SIGUSR1
przybywa, my:
- Załaduj wszystkie nowe wpisy z pliku historii do listy historii pamięci w powłoce.
Ze względu na sposób Bash uchwyty sygnałów, nie będzie rzeczywiście się nowych danych historii aż trafisz Enternastępnym razem, więc to nie robi nic lepszego na tym froncie niż oddanie history -n
się PROMPT_COMMAND
. Jednak zapisywanie odczytu pliku jest ciągłe, gdy nic się nie wydarzyło, i nie ma zapisu w ogóle, dopóki powłoka nie wyjdzie.
Wciąż jednak pozostaje kilka problemów. Po pierwsze, domyślną odpowiedzią SIGUSR1
jest zakończenie powłoki. Wszelkie inne bash
procesy (na przykład uruchamianie skryptów powłoki) zostaną zabite. .bashrc
nie jest ładowany przez nieinteraktywne powłoki. Zamiast tego ładowany jest plik nazwany przezBASH_ENV
: możesz ustawić tę zmienną w swoim środowisku globalnie, aby wskazywała na plik za pomocą:
trap '' USR1
w nim, aby zignorować sygnał w nich (co rozwiązuje problem).
Wreszcie, mimo że spełnia to zadanie, zamówienie, które otrzymasz, będzie nieco nietypowe. W szczególności fragmenty historii będą powtarzane w różnych kolejności, gdy zostaną załadowane i zapisane osobno. Jest to zasadniczo związane z tym, o co prosisz, ale pamiętaj, że historia strzałek w górę staje się w tym momencie o wiele mniej przydatna. Zastąpienia historii i tym podobne będą jednak udostępniane i będą działać dobrze.