Vím, že tato otázka není nejasná, protože je zde položena, průběžně aktualizujte (a zde duplikujeme).
To, čeho se snažím dosáhnout, je trochu jiné. Nelíbí se mi myšlenka mého promptu přepisovat soubor každý ls Píšu (history -a; history -c; history -r ).
Při ukončení bych chtěl soubor aktualizovat. To je snadné (ve skutečnosti výchozí), ale místo přepisování je třeba připojit:
shopt -s histappend
Nyní, když je terminál zavřený, rád bych, aby všechny ostatní, které zůstanou otevřené, byly informovány o aktualizaci.
Raději to dělám bez kontroly přes $PS1 na každý command že píšu. Myslím, že by bylo lepší zachytit nějaký signál. jak bys to udělal? Pokud to není možné, možná jednoduchý cronjob ?
Jak můžeme vyřešit tuto hádanku?
Přijatá odpověď:
Kreativní a zapojující signály, říkáte? OK:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Zahoďte to do .bashrc a jít. To pomocí signálů řekne každému bash proces kontroly nových záznamů historie, když se ukončí jiný. To je docela hrozné, ale opravdu to funguje.
Jak to funguje?
trap nastavuje obsluhu signálu buď pro systémový signál, nebo pro jednu z Bashových interních událostí. EXIT událost je jakékoli řízené ukončení shellu, zatímco USR1 je SIGUSR1 , nesmyslný signál, který si přivlastňujeme.
Kdykoli shell opustí, my:
- Explicitně připojit veškerou historii k souboru.
- Zakažte
SIGUSR1handler a přiměje tento shell ignorovat signál. - Pošlete signál všem spuštěným
bashprocesy od stejného uživatele.
Když SIGUSR1 přijede, my:
- Načtěte všechny nové položky ze souboru historie do seznamu historie shellu v paměti.
Vzhledem k tomu, jak Bash zpracovává signály, ve skutečnosti nezískáte nová data historie, dokud nestisknete Enter příště, takže to v tomto ohledu není o nic lepší než zadání history -n do PROMPT_COMMAND . Ušetří však neustálé čtení souboru, když se nic neděje, a dokud se shell neukončí, neprobíhá žádný zápis.
Stále zde však existuje několik problémů. První je, že výchozí odpověď na SIGUSR1 je ukončit shell. Jakýkoli jiný bash procesy (například spuštěné skripty shellu) budou zabity. .bashrc není načten neinteraktivními shelly. Místo toho soubor s názvem BASH_ENV je načten:tuto proměnnou můžete ve svém prostředí globálně nastavit tak, aby ukazovala na soubor s:
trap '' USR1
v něm ignorovat signál v nich (což řeší problém).
Související:Příkaz terminálu pro zjištění, zda je server virtuální nebo fyzický?A konečně, ačkoli to dělá to, o co jste žádali, objednávka, kterou dostanete, bude trochu neobvyklá. Zejména bity historie se budou opakovat v různém pořadí, jak se načítají a ukládají samostatně. To je v podstatě neodmyslitelné od toho, co požadujete, ale uvědomte si, že historie šipky nahoru se v tomto bodě stává mnohem méně užitečnou. Náhrady historie a podobně však budou sdíleny a budou fungovat dobře.