Fórum Root.cz
Hlavní témata => Software => Téma založeno: byl_jsem_donucen_se_registrovat 02. 04. 2024, 17:29:11
-
Ahoj všem. Nastavil jsem si nekonečnou bash history podle návodu na webu https://www.soberkoder.com/unlimited-bash-history/ a na první pohled to vypadalo že se historie spuštěných příkazů ukládá tak jak má. Bohužel jsem po čase zjistil že mi ze souboru .history/.bash_history občas zmizí několik stovek příkazů. Níže je moje nastavení historie v .bashrc (zkráceno):
shopt -s histappend
export HISTFILESIZE=-1
export HISTSIZE=-1
export HISTFILE=~/.history
export HISTTIMEFORMAT="[%F %T] "
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
export HISTCONTROL=ignoredups
Po každém spuštěném příkazu by se měla historie uložit (histappend) díky nastavení v proměnné PROMPT_COMMAND. Jako emulátor terminálu používám Tilix ve kterém běží bash 5.1.16 (Ubuntu 22.04 LTS). V Tilix profilu je nastaveno "Run command as login shell".
Netuší někdo čím by tohle chování mohlo být způsobeno? Případně jaká další nastavení bych mohl zkontrolovat?
Předem všem děkuji za reakce.
-
Není to tím, že bash běží ve více instancích? Nevím, jestli to je normální či není, ale minimálně mně se uloží do historie vždy jen historie posledního ukončeného procesu (čili obvykle posledního zavřeného terminálu). Nemůže to být totéž?
-
Je to tak. Bash má historii v paměti a po ukončení ji zapíše do .bash_history. Tím pádem tam bude historie z toho posledního.
Ono to jde nastavit, aby se to tam zapisovalo hned, tím tam budou sice všechny příkazy, ale míchá se to mezi více shelly, takže když děláte v jednom něco a v druhém něco jiného, tak se to bude motat. Takže jsem to měl jen chvilku, nezvyk jsem si a zrušil jsem to.
-
Klasickou bash historii používám pouze na šipku nahoru (nedávno provedené příkazy). Na dlouhodobější historii jsem si nainstaloval Atuin (https://atuin.sh/), který mám nabindovaný na Ctrl+R. Dá se v tom hezky vyhledávat a nic se neztrácí. V ~/.config/atuin/config.toml mám nastaveno
enter_accept = false
, abych ještě příkaz mohl po potvrzení entrem upravit. V ~/.bashrc jsem upravil atuin init bash
na atuin init bash --disable-up-arrow
, tím se zachová normální funkce šipky nahoru.
-
Je to tak. Bash má historii v paměti a po ukončení ji zapíše do .bash_history. Tím pádem tam bude historie z toho posledního.
Ono to jde nastavit, aby se to tam zapisovalo hned, tím tam budou sice všechny příkazy, ale míchá se to mezi více shelly, takže když děláte v jednom něco a v druhém něco jiného, tak se to bude motat. Takže jsem to měl jen chvilku, nezvyk jsem si a zrušil jsem to.
To si právě myslím že mám nastaveno tím history -a, což by měl měl být append history dané bash session, po spuštění příkazu se příkaz ihned objeví v .history souboru:
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
-
Zkus přijít na replikační scénář. Ten config vypadá na první pohled ok, histappend tam máš taky... Třeba ten problém není s více terminály najednou, ale s něčím jiným.
-
Je to tak. Bash má historii v paměti a po ukončení ji zapíše do .bash_history. Tím pádem tam bude historie z toho posledního.
Ono to jde nastavit, aby se to tam zapisovalo hned, tím tam budou sice všechny příkazy, ale míchá se to mezi více shelly, takže když děláte v jednom něco a v druhém něco jiného, tak se to bude motat. Takže jsem to měl jen chvilku, nezvyk jsem si a zrušil jsem to.
To si právě myslím že mám nastaveno tím history -a, což by měl měl být append history dané bash session, po spuštění příkazu se příkaz ihned objeví v .history souboru:
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
Ano, tak nějak to bylo. Ale jestli si pamatuju dobře, tak to stejně úplně nefungovalo - nebralo to všechno. Navíc nejde pak intuitivně používat šipka nahoru v jednotlivých terminálech, jak se to míchá vše dohromady. Tak jsem to vypnul.
-
Je to tak. Bash má historii v paměti a po ukončení ji zapíše do .bash_history. Tím pádem tam bude historie z toho posledního.
Ono to jde nastavit, aby se to tam zapisovalo hned, tím tam budou sice všechny příkazy, ale míchá se to mezi více shelly, takže když děláte v jednom něco a v druhém něco jiného, tak se to bude motat. Takže jsem to měl jen chvilku, nezvyk jsem si a zrušil jsem to.
To si právě myslím že mám nastaveno tím history -a, což by měl měl být append history dané bash session, po spuštění příkazu se příkaz ihned objeví v .history souboru:
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
Ano, tak nějak to bylo. Ale jestli si pamatuju dobře, tak to stejně úplně nefungovalo - nebralo to všechno. Navíc nejde pak intuitivně používat šipka nahoru v jednotlivých terminálech, jak se to míchá vše dohromady. Tak jsem to vypnul.
Takhle "hloupě" se to chová při nastavení
export PROMPT_COMMAND="histrory -a;history -c; history -r;$PROMPT_COMMAND"
- history -c clears the in-memory history
- history -r appends the contents history file to the in-memory history
Jelikož používám ext4 tak jsem zkusil nastavit soubor s historií tak aby se do něj dal dělat pouze append, třeba mi to pomůže:
chattr +a .history
-
Klasickou bash historii používám pouze na šipku nahoru (nedávno provedené příkazy). Na dlouhodobější historii jsem si nainstaloval Atuin (https://atuin.sh/), který mám nabindovaný na Ctrl+R. Dá se v tom hezky vyhledávat a nic se neztrácí. V ~/.config/atuin/config.toml mám nastaveno enter_accept = false
, abych ještě příkaz mohl po potvrzení entrem upravit. V ~/.bashrc jsem upravil atuin init bash
na atuin init bash --disable-up-arrow
, tím se zachová normální funkce šipky nahoru.
Atuin vypadá dobře, možná vyzkouším, neznal jsem, díky.
-
Prispejem jednym skvostom: per-directory-history pre zsh - https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/per-directory-history (https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/per-directory-history)
Pouzívam oh my zsh a plugin per-directory-history (a asi este git plugin) a po stipke zvykania som si zvykol a nemenim.
Prax: kazdy adresar ma vlastnu historiu a je dostupna klasicky sipkou hore a skratkou ctrl+r pre hľadanie. Kedykoľvek stlačím ctrl+g, tak sa prepnem do "global history" a vyhľadávam v histórii všetkých adresárov...
PS: Vďaka tomuto si niekedy vytváram aj prázdne adresáre v ~/tmp adresári, ktoré slúžia ako "projekt" pre niečo. Napríklad, keď si chcem spustiť nejaký docker kontajner a pohrať sa s ním jednorazovo. Takto sa viem vrátiť k experimentu neskôr.