Řešení 1:
Chcete-li porozumět chování historie bash, musíte nejprve znát následující:
- V souboru historie je historie.
- V paměti procesu bash je historie.
- Historie v paměti jednoho procesu bash není synchronizována s historií v paměti žádného jiného procesu bash.
- Historie v paměti procesu bash se nesynchronizuje s historií v souboru, pokud k tomu nebudete výslovně požádáni nebo během nějaké konkrétní události (viz níže).
Při použití výchozího nastavení je životní cyklus relace bash s ohledem na historii následující:
- Během spouštění bude bash číst soubor historie. Obsah souboru historie je nyní v paměti procesu bash.
- Během normálního používání se manipuluje pouze s historií v paměti.
- Během vypínání se historie v paměti zapisuje do souboru historie, čímž se přepíše veškerý předchozí obsah souboru historie.
Zdánlivě nedeterministické chování, které jste pozorovali, je většinou způsobeno tím, že obsah souboru historie je vždy historií poslední uzavřené relace bash a bash čte soubor historie pouze během spouštění.
Přečtěte si příručku bash pro podrobnější vysvětlení procesu spouštění a vypínání.
Všimněte si, že výchozím nastavením mám na mysli výchozí nastavení z bash. Vaše distribuce mohla obsahovat .bashrc
(nebo /etc/bash.bashrc
), které toto chování mění.
Povolením možnosti shellu histappend
můžete bashovi říct, aby místo přepisování souboru historie přidal připojení. Můžete povolit histappend
pomocí příkazu shopt -s histappend
. Aby byla tato možnost vždy povolena, musíte příkaz vložit do .bashrc
(nebo jiný inicializační soubor). Přečtěte si více o shopt
příkaz v příručce bash
Všimněte si, že povolení histappend
zdánlivě nedeterministické chování příliš nesníží. Je to proto, že každá bash session má stále v paměti svou vlastní historii. Je možné mít většinou synchronizovanou historii bash. Existuje návod, jak dosáhnout toho, aby měl každý bash proces většinou synchronizovanou historii ve vláknu při přetečení zásobníku.
pomocí vestavěného příkazu history
můžete bash explicitně říct, aby četl historii ze souboru do paměti nebo zapisoval z paměti do souboru. Například:history -r
přečte obsah souboru a připojí jej k historii v paměti. history -w
zapíše aktuální historii z paměti do souboru a přepíše předchozí obsah. To je v podstatě to, co se děje během vypnutí. Přečtěte si více o history
příkaz v příručce bash
Pro úplnost zde uvádíme seznam interních proměnných, které modifikují chování historie:
HISTFILE
:soubor pro čtení a zápis historie.HISTFILESIZE
:maximální počet řádků pro soubor historie.HISTSIZE
:maximální počet řádků pro historii v paměti.HISTCONTROL
,HISTIGNORE
,HISTTIMEFORMAT
:není pro tuto diskusi relevantní. Podrobnosti naleznete v příručce bash.
Řešení 2:
http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively
Můžete být schopni manipulovat se způsobem zápisu souboru historie pomocí jednoho z terminálů, tj. spustit "history -a" nebo "history -w" v terminálu, do kterého chcete uložit historii, a poté "history -r" v ostatní terminály. Záleží na tom, co chcete dělat.