GNU/Linux >> Znalost Linux >  >> Linux

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

Řešení 1:

Chcete-li porozumět chování historie bash, musíte nejprve znát následující:

  1. V souboru historie je historie.
  2. V paměti procesu bash je historie.
  3. Historie v paměti jednoho procesu bash není synchronizována s historií v paměti žádného jiného procesu bash.
  4. 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í:

  1. Během spouštění bude bash číst soubor historie. Obsah souboru historie je nyní v paměti procesu bash.
  2. Během normálního používání se manipuluje pouze s historií v paměti.
  3. 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.


Linux
  1. Jak vymazat historii Bash na Linuxu

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

  3. Historie Bash:„ignoredups“ a „erasedups“ Nastavení konfliktu se společnou historií napříč relacemi?

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

  2. Automatické vyčištění historie Bash?

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

  1. Jak používat příkazy historie Bash

  2. Analýza historie Bash v Linuxu

  3. Nějaký způsob, jak se vyhnout tečkovému lomítku při spouštění spustitelných skriptů v bash?