Vraag Bash geschiedenis afhandeling met meerdere terminals


Ik gebruik voornamelijk Terminator en wordt meestal geopend met 3 split-terminalvensters. Ik gebruik de Gnome-terminal ook om verschillende redenen.
Ik vraag me af hoe de bash-geschiedenis in dit geval wordt behandeld, omdat ik soms eerder uitgegeven opdrachten mis wanneer ik het spel uitvoer history

Mijn prompt toont bijvoorbeeld de huidige bash-geschiedenisregel (\!) en als ik Terminator start met 3 split-terminalvensters, krijg ik dezelfde geschiedenislijn (zeg 100) op alle terminals. Welke geschiedenis wordt opgeslagen?

Ik start ook Gnome Terminal op na het gebruik van Terminator. Ik krijg regel 100 bij het opstarten, ongeacht alle eerder in Terminator uitgegeven opdrachten


89
2017-11-18 06:39


oorsprong




antwoorden:


De bash-sessie die wordt opgeslagen, is die voor de terminal die het laatst is afgesloten. Als u de opdrachten voor elke sessie wilt opslaan, kunt u de uitleg uitgelegd gebruiken hier.

export PROMPT_COMMAND='history -a'

Om de manpage te citeren: "Indien ingesteld, wordt de waarde als een opdracht uitgevoerd voorafgaand aan het afgeven van elke primaire prompt."

Dus elke keer dat mijn opdracht is voltooid, wordt het ongeschreven geschiedenisitem toegevoegd aan ~/.bash_history voordat de prompt (alleen $ PS1) opnieuw wordt weergegeven.

Dus na het plaatsen van die regel /etc/bash.bashrc Ik hoef niet opnieuw wielen uit te vinden of waardevolle seconden te verliezen door opnieuw te typen, alleen maar omdat ik lui was met mijn terminals.

Hoe dan ook, u moet er rekening mee houden dat opdrachten uit verschillende sessies in uw geschiedenisbestand worden gemengd, zodat het niet zo eenvoudig is om het later te lezen.

Zie ook:


82
2017-11-18 06:52



wordt het niet afzonderlijk opgeslagen voor verschillende TTL? - Vineet Menon
Uitstekend. Bedankt voor de uitleg en de oplossing. Ik heb geprobeerd met export PROMPT_COMMAND='history -a; history -r' en ik kreeg een aantal vreemde geschiedenislijnnummers in terminal - na het uitgeven van een commandoregister regelnummer springt in 2000 in plaats daarvan door 1, wat vreemd is maar het gedraagt ​​zich zoals gezegd - alle terminals geschiedenis wordt opgeslagen. - zetah
@VineetMenon Kijk voor meer informatie hier. Interessante delen: wanneer de shell opstart, wordt de geschiedenis geïnitialiseerd vanuit het bestand met de naam HISTFILE (standaard `~ / .bash_history '). [...] Wanneer een interactieve shell wordt afgesloten, worden de laatste $ HISTSIZE-regels gekopieerd van de geschiedenislijst naar het bestand met de naam $ HISTFILE. - jcollado
Deze website lijkt down: northernmost.org/blog/flush-bash_history-after-each-command - Shubham


Na meerdere metingen van man bash, Ik gebruik aparte geschiedenisbestanden voor elke shell. ik heb een mkdir -m 0700 ~/.history dan toegevoegd

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

aan mijn ~/.bashrc. Af en toe herinner ik het me du -sk .history en maak het schoon. Het is goed dat elke opdracht die ik heb getypt voor mij bewaard is gebleven.

Ik heb het bovenstaande net gebruikt om te zien wat ik de laatste tijd aan het doen was:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
of
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(om het eerste argument b.v. sudo mount in de sorteerketen).


27
2017-11-19 23:48



Waarom wijs je het toe HISTFILESIZE tweemaal? - Daniel
Door HISTFILESIZE in te stellen op 0, wis ik de geschiedenisbuffer en reset ik het geschiedenisbesparingsmechanisme. Vervolgens stel ik de gewenste grootte in en begin ik met het opslaan van de geschiedenis in HISTFILE. Zie de sectie HISTORIE van man bash. - waltinator
is er een manier om de geschiedenisbestanden samen te voegen om te maken Ctrl+r weer werken? - n611x007
Dit zou een nieuwe vraag moeten zijn, maar ik denk niet dat het een goed idee is. ik gebruik egrep 'whatever' .history/* (of cat .history/* | egrep 'whatever') in plaats daarvan en gebruik Ctrl-r om de geschiedenis van een individuele sessie te doorzoeken. Lezen man bash-builtins over de opdracht geschiedenis. Mijn sort .history/* | uniq -c | sort -n | wc -l toont 16033 unieke commando's, cut '-d ' -f1 .history/* | sort | uniq -c | sort -n toont 2004 unieke commando's, meestal typefouten. Het laden van dat alles in de "geschiedenislijst" van bash zou niet helpen. - waltinator


Zie ook "het houden van aanhoudende geschiedenis in bash"voor een ander alternatief. Het past je prompt aan om alle commando's te sturen die ooit getypt zijn ieder terminal in een "permanente geschiedenis" -bestand (naast wat meestal wordt gedaan voor de reguliere .history).


4
2018-01-24 23:33



Ik heb ingevoegd $$ om de lijn te maken echo $$ $date_part "$command_part" >> ~/.persistent_history Dit prefixeert de vermeldingen met de PID's van hun bash-proces, zodat we meerdere geschiedenissen kunnen ontwarren. - Evgeni Sergeev


Laten zien history van alle terminals:

Toevoegen export PROMPT_COMMAND='history -a; history -r' naar uw .bashrc-bestand.

Bron: http://northernmost.org/blog/flush-bash_history-after-each-command



4
2017-10-31 19:17



Ik zal zeggen dat ik dit, na een paar maanden gebruik ervan, onlangs nog heb becommentarieerd. Het is bitterzoet omdat ik niet altijd de laatste 100 commando's wil doornemen om de versie die ik oorspronkelijk in het Tmux-venster had, uit te voeren. Soms heb ik een speciaal logcommando, dat ik opnieuw moet opstarten. - Elijah Lynn
Een mooie oplossing die de vissenschaal biedt is een history --merge. Ik gebruik dit nu al een jaar en het lost het probleem op. Wanneer ik de meest recente geschiedenis van andere sessies wil, voer ik dat commando gewoon uit en het is meteen beschikbaar voor mij. - Elijah Lynn