it-swarm.dev

Je možné provést okamžitý zápis do .bash_history?

Často otvírám spousty a spousty terminálů [Právě teď mám 7 otevřených v tomto pracovním prostoru] a často hledám history s grep, abych našel příkaz, který jsem právě napsal, ale ne Nechci lovit terminál a pak se posunout nahoru a honit za ním víc, atd. Někdy se moje terminály uzavírají bez „exit“ a všechno, co jsem napsal, je ztraceno [Někdy jsem potřeboval něco, co jsem napsal terminál, který byl zabit].

Existuje tedy způsob, jak to udělat, aby každý terminál okamžitě zapsal .bash_history? nebo alespoň jednou za minutu, nebo něco takového?

138
Matt

Jednoduché řešení, jak je podrobně uvedeno v Aktualizace historie basů v reálném čase .

Říká se, že tyto příkazy vložíte do .bashrc config:

shopt -s histappend
Prompt_COMMAND="history -a;$Prompt_COMMAND"

První příkaz změní .history režim souborů připojit. A druhý konfiguruje history -a příkaz, který má být spuštěn na každém Shell Prompt. The -a okamžitě zapíše aktuální/nové řádky do souboru historie.

Související pro zsh:

97
mario

Zkuste to vložit do svého .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export Prompt_COMMAND="history -a; history -c; history -r; $Prompt_COMMAND"

Kredit zde: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -c vymaže historii spuštěné relace. Tím se sníží počítadlo historie o částku $HISTSIZE. history -r přečtěte si obsah $HISTFILE a vložte je do aktuální spuštěné historie relací. Tím se zvýší počitadlo historie o počet řádků v $HISTFILE.

Myslím, že to znamená, že příkazy jsou k dispozici téměř okamžitě (máte jeden terminál, napište echo 1, druhý terminál echo 2, za prvé echo 3 a po dvojím stisknutí šipky dolů byste měli mít echo 2 dostupný. Musíte mít v daném terminálu příkaz, abyste měli přístup k tomu, co bylo napsáno.

60
sup

Mám velký soubor historie s asi 100 000 záznamy a variantami, které vymaže seznam historie a přečtou celý soubor historie (pomocí history -c a history -r) před zobrazením výzvy zadejte znatelné (možná 0,2 sekundy) zpoždění. Použitím history -n tak, aby se z historického souboru načítaly pouze nové řádky, je rychlejší:

shopt -s histappend
Prompt_COMMAND='history -a;history -n'

Prompt_COMMAND nemusí být exportováno, protože se jedná o proměnnou Shell.

41
nisetama

Poznámka pro všechny ostatní odpovědi (které jsou v podstatě stejné):

Nastavení Prompt_COMMAND="history -a;$Prompt_COMMAND" v .bashrc (nebo přátelé) je dost.

Můžete také ručně spustit history -a kdykoli chcete "snímek" historie v aktuální relaci.

Příkaz shopt -s histappend není potřeba, protože history -a k souboru vždy připojí nové řádky a nikdy jej nepřepíše. Také, alespoň od Bash 4, histappend je výchozí chování.

3
Guss