GNU/Linux >> Znalost Linux >  >> Linux

Aktualizovat historii Bash na jiných terminálech při ukončení jednoho terminálu?

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 SIGUSR1 handler a přiměje tento shell ignorovat signál.
  • Pošlete signál všem spuštěným bash procesy 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.


Linux
  1. Proč je Bash Prompt odposloucháván, když procházím historii?

  2. The Bash ‘?

  3. Jak uložit + zavřít soubor při úpravách v bash?

  1. Analýza historie Bash v Linuxu

  2. Provádění operací atomického zápisu do souboru v bash

  3. Podivné chování historie bash při spuštění více relací

  1. Zachovat historii Bash ve Windows s více terminály?

  2. Smazat historii terminálu v Linuxu

  3. Jak uchovám historii bash napříč relacemi?