Vraag Is het mogelijk om het schrijven naar .bash_history onmiddellijk te maken?


Ik open vaak heel veel Terminals [op dit moment heb ik er 7 open op deze werkruimte] en ik zoek vaak history met grep om een ​​opdracht te vinden die ik net heb geschreven, maar ik wil niet op de terminal jagen en dan omhoog scrollen en er meer op zoeken, enz. Soms sluiten mijn terminals zonder 'exit' en alles wat ik heb geschreven is verloren [Soms heb ik iets nodig dat ik in een terminal had geschreven die werd vermoord].

Dus is er een manier om het zo te maken dat elke terminal onmiddellijk naar .bash_history schrijft? of minstens één keer per minuut, of zoiets?


100
2017-10-16 03:09


oorsprong


Normaal gebruik ik control-r om terug te zoeken in de opdrachtgeschiedenis van één bash. Handiger dan history | grep tenzij je een regex nodig hebt. - Peter Cordes


antwoorden:


Een eenvoudige oplossing zoals beschreven in Update Bash History in Realtime.

Het zegt om die commando's in de .bashrc config te plaatsen:

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

Het eerste commando verandert de .history bestandsmodus om toe te voegen. En de tweede configureert de history -a commando dat bij elke shell-prompt moet worden uitgevoerd. De -a schrijft onmiddellijk de huidige / nieuwe regels naar het geschiedenisbestand.

Gerelateerd voor zsh:


70
2017-10-16 04:29



nou dit soort werken. Ik heb nog meer geprobeerd en het lijkt alleen maar op het eerste commando te werken. werkt het correct voor u? - Matt


Probeer dit in je te plaatsen .bashrc:

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

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

history -c wist de geschiedenis van de lopende sessie. Dit zal de historieteller verminderen met de hoeveelheid $HISTSIZE. history -r lees de inhoud van $HISTFILE en voeg ze in de huidige lopende sessiegeschiedenis. Hierdoor wordt de teller van de geschiedenis verhoogd met het aantal regels in $HISTFILE.

Ik denk dat dit betekent dat de commando's bijna onmiddellijk beschikbaar zijn (je hebt één terminal, schrijf echo 1, tweede terminal echo 2, eerste echo 3 en als je twee keer op de pijl naar beneden drukt, zou je dat moeten doen echo 2 beschikbaar. U moet in een gegeven terminal een opdracht geven om toegang te hebben tot wat er is geschreven.


50
2018-03-24 12:56



Briljant! Bedankt. Vraag me af waarom die opties niet zijn gedocumenteerd man history... - artfulrobot
@artfulrobot: deze opdracht is a bash ingebouwd zodat het wordt beschreven in man bash. Je kan ook gebruiken help history. - pabouk
Ik heb mijn zsh geconfigureerd om op deze manier te werken: Elke shell volgt zijn EIGEN geschiedenis (en daarvoor de gecombineerde geschiedenis) en elke opdracht wordt toegevoegd aan de gecombineerde geschiedenis. Dit is verschillend en beter dan altijd de geschiedenis opnieuw laden voor elke opdracht voor elke shell, omdat ik de neiging heb om een ​​andere "thread of work" of "job" te hebben voor elke shell terminal. Ik denk dat dat het verschil is tussen dit en -r en -c vs gewoon hebben -a. - Steven Lu
Dus wat gebruik je precies? history -c; history -r? Ik denk dat het beter voor je is, het zou beter zijn voor mij alleen soms, ik gebruik vaak meerdere schelpen om een ​​klus te klaren, dus geef ik er de voorkeur aan om de geschiedenis zo veel mogelijk gecombineerd te hebben. Ik vind het eigenlijk erg dat het commando pas in de geschiedenis wordt geschreven nadat het is voltooid. meestal, wanneer ik een ssh-sessie start met één host en een andere sessie wil openen terwijl de eerste nog draait, moet ik deze opnieuw typen omdat deze nog niet in de geschiedenis is geschreven. - sup
Ik denk dat ik nooit lang genoeg rond heb gestaan ​​om erachter te komen hoe bash simultaan parallelle threads van geschiedenis kan bijhouden (per shell instance-basis) terwijl onmiddellijk geschiedenis schrijven naar het hoofdgeschiedenisbestand. Zsh maakt het veel gemakkelijker om dat te doen, plus daarnaast heb ik een zsh-functie gedefinieerd om veel mooie metadata naar een verbeterde-geschiedenis bestand van mijn ontwerp. Het is nogal onmisbaar geworden. Hoe dan ook, het mechanisme daar is precmd () en preexec () voor zsh krijgt verzonden args die het ingevoerde commando beschrijven. Het wordt dan triviaal om dat naar bestanden te sturen. history -a zou kunnen volstaan - Steven Lu


Ik heb een groot geschiedenisbestand met ongeveer 100000 vermeldingen en de varianten die de geschiedenislijst wissen en het hele geschiedenisbestand lezen (met history -c en history -r) introduceer een merkbare vertraging (misschien 0,2 seconden) voordat de prompt wordt weergegeven. Gebruik makend van history -n zodat alleen nieuwe regels worden gelezen uit het geschiedenisbestand is sneller:

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

PROMPT_COMMAND hoeft niet geëxporteerd te worden omdat het een shell-variabele is.


30
2017-09-12 12:23



Briljant! Nooit meer verloren geschiedenis als de verbinding wordt verbroken! - Tobia
Dit is geweldig. Door aan het bestand toe te voegen en uit een bestand te lezen, wordt de geschiedenis over meerdere terminals gedeeld. - wisbucky


Een opmerking voor alle andere antwoorden (die in feite hetzelfde zijn):

omgeving PROMPT_COMMAND="history -a;$PROMPT_COMMAND" in de .bashrc (of vrienden) is genoeg.

U kunt ook handmatig uitvoeren history -a wanneer u de geschiedenis in de huidige sessie wilt "momentopnemen".

Het bevel shopt -s histappend is niet nodig omdat history -a voegt altijd nieuwe regels toe aan het bestand en overschrijft het nooit. Ook, tenminste vanaf Bash 4, histappend is het standaardgedrag.


2
2017-07-04 10:22



Op mijn mac 10.13.6 leek het niet te werken zonder de shopt -s histappend. Merk ook op dat ik het aan mijn heb toegevoegd ~/.bash_profile - ubershmekel
Waarschijnlijk is er ergens in uw systeem een ​​andere instelling die uitgeschakeld is histappend, omdat dat het standaardgedrag is. Ik zou het zoeken, maar ik heb geen toegang tot een Mac. - Guss