Aus irgendeinem Grund kann ich mein System nach einem Neustart nicht dazu bringen, meinen BASH-Verlauf zu speichern. Hier sind die relevanten Abschnitte meiner ~/.bashrc
:
shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"
Soweit ich das beurteilen kann, gibt es alle erforderlichen Optionen (ich weiß, dass ich früher in der Lage war, den Verlauf über mehrere Neustarts hinweg zu verfolgen, ohne dass dies alles in der Vergangenheit passiert ist). Obwohl ich diese Optionen vor einigen Neustarts hinzugefügt habe, verliere ich nach einem Neustart immer noch den größten Teil meines Verlaufs. Es ist nicht leer, hat aber nicht die 9999 Leitungen, die ich vor dem Neustart hatte.
Bevor sich jemand beschwert, habe ich ja diese Fragen gelesen. Ich habe einige ihrer Vorschläge wie oben aufgeführt umgesetzt, der Rest war entweder nicht hilfreich oder nicht relevant:
- Bash-Verlaufsverlust bei Verwendung von Histappend
- Wie kann man verhindern, dass Bash die Geschichte verändert?
- Was bestimmt, was im Befehl bash history angezeigt wird?
- Wie kann ich meinen Bash-Verlauf über mehrere Sitzungen hinweg aufbewahren?
- Speichern Sie regelmäßig die Bash-Historie
Für den Fall, dass es möglicherweise andere relevante Befehle gibt, können Sie meinen gesamten Inhalt ~/.bashrc
hier anzeigen .
Also, was fehle ich? Warum wird mein Verlauf nicht gespeichert? Wenn jemand der Meinung ist, dass eine andere Datei relevant sein könnte, lass es mich wissen und ich werde es veröffentlichen. Ich überprüfte, indem ich grep -i hist \.*
mein $HOME
ausführte, das zeigte, dass die einzige relevante .
Akte, die die Zeichenkette enthielt hist
oder HIST
war .bashrc
.
Ich verwende Linux Mint Debian Edition, GNU Bash, Version 4.2.36 (1) -Release (x86_64-pc-linux-gnu) und meinen bevorzugten Terminal-Emulator (falls relevant) terminator
.
AKTUALISIEREN:
Dem Vorschlag von @ mpy in den Kommentaren folgend, habe ich meine ~/.bashrc
Einstellung geändert und nicht HISTFILE=~/bash_history
die Standardeinstellung. Dies ~/.bash_history
scheint das Problem für interaktive Shells zu lösen . Anmelde-Shells zeigen immer noch dasselbe Verhalten, wobei der Verlauf in 500
Zeilen abgeschnitten ist. In HIST
den relevanten Dateien sind jedoch keine zugehörigen Variablen festgelegt:
$ for f in /etc/profile ~/.profile ~/.bash_profile ~/.bash_login; do \
echo -ne "$f :"; echo `grep HIST $f`; \
done
/etc/profile :
/home/terdon/.profile :grep: /home/terdon/.profile: No such file or directory
/home/terdon/.bash_profile :grep: /home/terdon/.bash_profile: No such file or directory
/home/terdon/.bash_login :grep: /home/terdon/.bash_login: No such file or directory
$ grep -r HIST /etc/profile.d/ <-- returns nothing
Also, warum setzt HISTSIZE
und HISTFILESIZE
in dem ~/.bashrc
nicht genug , wenn ich explizit die $HISTFILE
auf etwas anderes als der Standard ~/.bash_history
?
history
Befehl ausführen , ist die angezeigte Ausgabe identisch mit der angezeigten Ausgabe, abgesehen voncat .bash_history
den Zeilennummern. Ich meine, listet derhistory
Befehl Zeitstempel oder andere Informationen auf? Der Grund, den ich frage, ist, wenn Sie diese esoterischen Dinge sehen, bedeutet dies, dass es ein anderes Modul / eine andere Funktion / ein anderes Programm gibt, das mit der Shell-Historie in Konflikt gerät, und dass eine falsche oder fehlerhafte Version dessen, was auch immer es ist, Sie möglicherweise betrübt .;)
: Probieren Sie eine andere Datei als HISTFILE aus, nicht die Standarddatei~/.bash_history
. Sehr konstruierte Erklärung: Ich gehe davon aus, dass bash Ihre Standard-Shell ist. Beim Systemstart ist also eine nicht interaktive Shell das übergeordnete Element Ihrer X-Sitzung (ich gehe auch davon aus, dass Sie X verwenden), die nichts über die Option histappend weiß (da .bashrc nur ist) gelesen von interaktiven Shells), so lange diese übergeordnete Shell ausgeführt wird, ist alles in Ordnung, aber beim Beenden (dh Systemstopp) wird es überschrieben~/.bash_history
(was Standard ist) und Ihre GeschichteAntworten:
Das Problem ist auf das unterschiedliche Verhalten von Anmelde- und Nicht-Anmelde-Shells zurückzuführen. Ich hatte die Variablen, die den Verlauf steuern, in meinem festgelegt
~/.bahsrc
. Diese Datei wird nicht gelesen, wenn eine Anmeldeshell gestartet wird. Sie wird nur von interaktiven Shells (vonman bash
) gelesen, die keine Anmeldeshells sind :Daher wurde die
.history
Datei jedes Mal, wenn ich mich anmeldete, auf ein tty ablegte oder ssh verwendete, abgeschnitten, weil ich sie nicht auf die richtige Größe eingestellt hatte~/.profile
. Ich habe das endlich erkannt und stattdessen einfach die Variablen~/.profile
dort gesetzt, wo sie hingehören~/.bashrc
Der Grund, warum ich
~/.history
abgeschnitten wurde, war, dass ich nur die HISTORY-Variablen in einer Datei festgelegt hatte, die von interaktiven, nicht angemeldeten Shells gelesen wurde. Daher wurden die Variablen jedes Mal ignoriert, wenn ich einen anderen Shell-Typ ausführte, und die Datei wurde abgeschnitten entsprechend.quelle
.bashrc
wird nicht von (nicht interaktiven ODER Login-Shells) gelesen.export BASH_ENV=~/.bashrc ; if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
werden:[ -z "$PS1" ] && return
... Natürlich ist es nur eine Redewendung.BASH_ENV
ist nicht relevant, es betrifft nur nicht interaktive Shells. Was die "Redewendung" betrifft, so hat Debian damit begonnen und ich persönlich bin damit nicht einverstanden. Ich habe häufig grafische Optionen (xset
und ähnliches) in meinem .bashrc und ich möchte nicht, dass diese aktiv sind, wenn ich Login-Shells von einem tty oder durchlaufessh
. Ich möchte mein .profile und .bashrc getrennt haben. Viele (wenn auch nicht alle) Anmeldemanager geben beim Anmelden .profile ein, sodass globale Variablen am besten dort festgelegt werden, wo sie nur einmal und nicht bei jedem Öffnen eines Terminals gelesen werden.~/.profile
oder~/.bashrc
) werden zuletzt gelesen. Alles, was in diesen Einstellungen festgelegt ist, hat Vorrang vor den globalen Einstellungen. Sie haben vollkommen recht, Sie sollten diese Variablen nicht eingeben/etc/bash.bashrc
. Verwenden Sie stattdessen~/.profile
(oder~/.bash_profile
).Mein Vorschlag ist, eine andere Datei als zu verwenden
HISTFILE
, nicht die Standardeinstellung~/.bash_history
.Obwohl ich keine analytische Erklärung habe, werde ich versuchen zu skizzieren, was mich zu diesem Vorschlag geführt hat: Wenn Sie
bash
als Standard-Shell (Login-Shell) verwenden undX
(was beide sehr wahrscheinlich sind), haben Siebash
direkt nach der (grafischen ) eine laufende Instanz ) Anmeldung:Ich denke, diese Instanz ist eine Login-Shell, daher liest sie Ihre
~/.bashrc
nicht und weiß daher nichts über diehistappend
Option:Solange diese "übergeordnete Shell" ausgeführt wird, ist alles in Ordnung, aber bei Beendigung (dh Systemstopp) wird sie überschrieben
~/.bash_history
(da dies der Standardwert ist) und Ihren Verlauf durcheinander bringen oder ihn beim Systemstart auf (wieder Standard) 500 beschneiden Linien. (Oder vielleicht beides ...)Mir fällt auch auf, dass es nicht ausreicht, die Verlaufskonfiguration mit einzubeziehen
~/.bashrc
, da dies kein so ungewöhnliches Setup sein sollte. Ich habe keine Erklärung dafür.In Bezug auf Ihr Problem, dass "Login-Shells immer noch dasselbe Verhalten zeigen", können Sie versuchen, die Verlaufskonfiguration auch in Folgendes aufzunehmen
~/.bash_profile
:Leider kann ich keine gerechtfertigtere Erklärung mit Details aus meiner eigenen
bash
Konfiguration posten , da ich einzsh
Typ bin ...quelle
~/.bash_profile
löste das Problem. Ich verwende jetzt~/.bash_history
als Verlaufsdatei, habe aber einfach alle~/.bashrc
in meiner Frage gezeigten Zeilen hinzugefügt~/.bash_profile
. Ich bin mir immer noch nicht sicher, wer die interaktiven Shells vermasselt hat, aber es scheint jetzt zu funktionieren, danke!Da alle Ihre Einstellungen gemäß der Manpage in der richtigen Reihenfolge sind und die Verlaufsdatei nicht durch die Größe (Bytes) beschränkt ist, ist die einzig mögliche Erklärung, die ich mir vorstellen kann. Es hat damit zu tun, wie die Schale stirbt.
Gemäß der Online-Referenz erfolgt das ordnungsgemäße Verlassen (Speichern des Verlaufs) nur, wenn die Shell SIGHUP empfängt. Ich kann nicht wirklich erklären, wie Ihr System beim Neustart Signale weitergibt, aber ich vermute, dass Ihre Shell mit SIGKILL oder SIGPWR beendet wird.
Dies kann daran liegen, dass Ihr WM asynchron ausgeführt wird (warten) und der Terminalemulator aus dem WM stammt, in dem die Bash ein anderes Ausgangssignal als SIGHUP erhält. Es kann auch sein, dass das Betriebssystem zu schnell den "final kill" an alle Prozesse sendet, bevor das ursprüngliche SIGHUP es schafft, über X -> WM -> xterm zur Shell zu gelangen, möglicherweise weil das Beenden von X oder WM länger dauert als Es dauert, bis das Betriebssystem betriebsbereit ist.
Ich bin auf tiefen Gewässern mit diesem Zeug, aber ich denke, dass etwas in dieser Richtung das unberechenbare Verhalten verursacht. Ich hatte dieses Problem schon einmal und das beste Mittel ist die
exit
Bash, bei der Sie die Geschichte aufzeichnen möchten.Mir ist
history -a
in Ihrer Frage aufgefallen , und ich kann mir nicht vorstellen, warum das nicht ausreichen würde, um die Geschichte zu bewahren.Sie können das Problem beheben, indem Sie herausfinden, was Ihre Bash wirklich tötet, und dann herausfinden, wo das Signal herkommt, und das Problem dort beheben ):
Der beigefügte Screenshot zeigt, worüber ich im zweiten und dritten Absatz spreche. Die Sequenz dort ist, in der ich von links schale , die linke von rechts schale töte und die Geschichte katze.
Mann Bash
Online-Referenz
Demonstrativer Screenshot
quelle
/tmp/pso
, was du tötest? Ich verstehe Ihren Standpunkt zu den verschiedenen Kill-Signalen (obwohl ich, wie Sie sagen, dachte, dass es dashistory -a
ist, womit man sich befassen muss). Ich werde das eine Weile testen und berichten.Überprüfen Sie / etc / profile und /etc/profile.d/*
Vielleicht gibt es da etwas, das mit den Verlaufseinstellungen zu tun hat.
quelle
grep -r HIST /etc/profile.d/
nichts zurück, und ich habe bereits geprüft/etc/profile
.