Wiem, że to pytanie nie jest niejasne, ponieważ zadaje się je tutaj, aktualizuj (i duplikuj tutaj).
To, co próbuję osiągnąć, jest nieco inne. Nie podoba mi się pomysł, aby mój monit ponownie zapisywał plik przy każdym ls
wpisaniu ( history -a; history -c; history -r
).
Chciałbym zaktualizować plik przy wyjściu. To proste (właściwie domyślne), ale musisz dołączyć zamiast przepisywać:
shopt -s histappend
Teraz, kiedy terminal jest zamknięty, chciałbym, aby wszyscy inni, którzy pozostają otwarci, byli świadomi aktualizacji.
Wolę to robić bez sprawdzania za $PS1
każdym razem, command
gdy piszę. Myślę, że lepiej byłoby uchwycić jakiś sygnał. Jak byś to zrobił? Jeśli nie jest to możliwe, może proste cronjob
?
Jak rozwiązać tę zagadkę?
bash
shell
command-history
signals
Dr Beco
źródło
źródło
bash
. Może czas sprawdzić coś nowego, dla zabawy.Odpowiedzi:
Kreatywne i angażujące sygnały, mówisz? DOBRZE:
Wrzuć to
.bashrc
i idź. Wykorzystuje sygnały, aby kazać każdemubash
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, aUSR1
toSIGUSR1
, bez znaczenia sygnał jesteśmy przywłaszczenia.Za każdym razem, gdy powłoka wychodzi, my:
SIGUSR1
moduł obsługi i spraw, aby powłoka zignorowała sygnał.bash
procesów od tego samego użytkownika.Kiedy
SIGUSR1
przybywa, my: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 innebash
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ą: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.
źródło
.bashrc
sygnaturę czasową w pliku, a potem pojawił się coś w rodzaju kroniki towarzyszącej i okresowo korzystał z pliku, wysyłającSIGUSR1
fragment według własnego opisu , czy możesz odzyskać chronologiczną historię strzałek w górę?linux bug
? Dlaczego inny proces łapie USR1? (Wiem, że nie jest to omawiane tutaj, ale może ujawnię to we właściwym miejscu)BASH_ENV
mowa w tej odpowiedzi? A może znasz bardziej standardowy sposób na wyłączenie tego zła?