Bash-Verlauf wird zwischen Terminalsitzungen auf dem Mac nicht beibehalten


29

Meine Bash-Geschichte hat auf mysteriöse Weise aufgehört zu funktionieren, und ich habe keine Ahnung, wie ich sie beheben kann. So sieht mein .bashrc aus:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

Wenn ich es jedoch laufen echo $HISTFILElasse, druckt es aus /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Ich bin der Eigentümer der Datei .bash_history, daher bin ich mir nicht sicher, wie ich dieses Problem beheben soll.

Vielen Dank!


Hallo Nelson, willkommen bei Super User. Überprüfen Sie schnell die von Ihnen eingegebenen Leerzeichen?
Bertieb

Ja, das waren sie. Ich werde sie entfernen und zurückmelden.

@bertieb, ich habe die Leerzeichen entfernt und jetzt wird $ HISTFILESIZE korrekt wiedergegeben. Der Verlauf bleibt jedoch ungespeichert und $ HISTFILE druckt diese ungerade temporäre Verlaufsdatei aus (von der ich annehme, dass sie den Verlauf nur für diese Sitzung speichert).

Versuchen Sie $HISTFILEsich aus Interesse zu ändern ? Ich habe kein .bashrcOSX und echo $HISTFILEberichte über die erwartete Position. Hat das Auskommentieren der fraglichen Zeilen irgendeine Auswirkung?
Bertieb

1
Immer zitiert Pfadnamen variable Erweiterungen: HISTFILE="$HOME/.bash_history”. Ohne die Anführungszeichen ist Ihre Version ungültig, wenn der Pfad zu Ihrem Ausgangsverzeichnis Leerzeichen (oder möglicherweise andere Sonderzeichen) enthält.
Chris Seite

Antworten:


23

Terminal weist jeder Terminalsitzung eine eindeutige Kennung zu und kommuniziert diese über die Umgebungsvariable TERM_SESSION_ID, sodass Programme, die in einem Terminal ausgeführt werden, den anwendungsspezifischen Status beim Beenden und Neustarten von Terminal mit aktiviertem Resume speichern / wiederherstellen können.

In einem neuen Ordner (~ / .bash_sessions /) werden die für Sitzungen spezifischen HISTFILE- und .session-Dateien gespeichert.

Während des Shell-Starts wird die Sitzungsdatei ausgeführt. Alte Dateien werden regelmäßig gelöscht.

Das Standardverhalten sieht vor, dass der Bash-Befehlsverlauf unabhängig für jede wiederhergestellte Terminalsitzung gespeichert und wiederhergestellt wird. Außerdem werden Befehle für neue Sitzungen in den globalen Verlauf eingefügt.

Sie können dieses Verhalten deaktivieren und einen einzelnen Verlauf freigeben, indem Sie festlegen

export SHELL_SESSION_HISTORY=0

Wenn HISTTIMEFORMAT definiert ist, ist der Sitzungsverlauf standardmäßig deaktiviert (lesen Sie mehr in / private / etc / bashrc_Apple_Terminal).

Der Sicherungs- / Wiederherstellungsmechanismus ist deaktiviert, wenn die folgende Datei vorhanden ist:

~/.bash_sessions_disable

Apple hat bereits seit der Veröffentlichung von El Capitan ein gewisses Verhalten geändert, daher ist es besser, hier mehr darüber zu lesen less /private/etc/bashrc_Apple_Terminal


3
Deaktivieren Sie zunächst jedoch nicht den Mechanismus zum Speichern / Wiederherstellen. Wenn Sie Probleme mit dem Shell-Befehlsverlauf haben, versuchen Sie, dieses Problem zu beheben. Die ~/.bash_sessions_disableDatei ist als letzter Ausweg gedacht, falls ein Problem vorliegt, das nicht speziell gelöst werden kann. Es werden nicht nur die Befehlsverläufe pro Sitzung deaktiviert. Sie können auch nur die Befehlsverläufe pro Sitzung deaktivieren. Siehe die Kommentare in /etc/bashrc_Apple_Terminalfür Details.
Chris Seite

1
@ChrisPage Eigentlich hat Apple einige Skriptbits geändert. Aktualisierte Antwort, danke.
Diimdeep

@diimdeep Wo würde ich diese Zeile anhängen? export SHELL_SESSION_HISTORY=0
Zerohedge

@zerohedge .bashrcund .bash_profile unix.stackexchange.com/a/310150/15362
Diimdeep

@diimdeep Danke. Dies scheint gerade zu funktionieren. Hat es irgendwelche Konsequenzen?
Zerohedge

6

Nach dem El Capitan-Upgrade ist mir etwas Ähnliches aufgefallen. Durch einfaches Hinzufügen der Datei .bash_sessions_disablefile in Ihrem Home-Verzeichnis werden die neuen Bash-Sitzungen deaktiviert und die .bash_historywird wieder verwendet.

Dieser Reddit-Thread enthält weitere Informationen und Links.


Deaktivieren Sie zunächst jedoch nicht den Sicherungs- / Wiederherstellungsmechanismus. Wenn Sie Probleme mit dem Shell-Befehlsverlauf haben, versuchen Sie, dieses Problem zu beheben. Die ~/.bash_sessions_disableDatei ist als letzter Ausweg gedacht, falls ein Problem vorliegt, das nicht speziell gelöst werden kann. Es werden nicht nur die Befehlsverläufe pro Sitzung deaktiviert. Sie können auch nur die Befehlsverläufe pro Sitzung deaktivieren. Siehe die Kommentare in /etc/bashrc_Apple_Terminalfür Details.
Chris Seite

Danke Chris - was kann ich sonst noch deaktivieren? Mein Verlauf hat in den letzten Monaten wie erwartet funktioniert (genauso wie in der vorherigen OSX-Version und genauso wie in Linux). Weiß nicht warum sie es geändert haben?
Rab

@rabs Ich würde vorschlagen , das Hinzufügen SHELL_SESSION_HISTORY=0an der Spitze ~/.bash_profile.
Teejay

5

Sie können das RVM-Problem lösen, indem Sie auf die neueste RVM-Version aktualisieren oder Folgendes ausführen:

  echo 'shell_session_update' > $HOME/.bash_logout

Weitere Informationen finden Sie unter https://github.com/rvm/rvm/issues/3540 .


1
Netter Fix, ohne rvm ändern zu müssen.
mlo55

Sprechen wir über den Ruby Environment Manager (RVM) rvm.io ? Wann und warum sollte das geschehen?
MarkHu

3

Diese Antwort aus dem Reddit-Thread hat mich gerettet:

Es ist wahrscheinlich RVM, das verhindert, dass der Exit "hook" für bash_sessions ausgeführt wird. Wenn Sie die folgende Zeile in Ihrem .bash_profile auskommentieren, sollte dies funktionieren.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

Das hat in der Tat geholfen!
Karsten

0

Wenn es sich um einen Mac handelt, ist die Standardanmeldeshell wahrscheinlich bashund wird .profilestattdessen ausgeführt .bashrc. Sie haben also die falsche Datei bearbeitet.


Ich habe .profile so bearbeitet, dass es mit meinem .bashrc identisch ist, und der Verlauf wird immer noch nicht angezeigt.

@ NelsonLiu Was passiert, wenn Sie $HISTFILEin verschiedenen Teilen von Echo profile? Vielleicht schreiben Sie ein anderes Skript, das die Variable ändert? Ich habe beide Terminalund iTerm, bash 3und 4 beide haben ihren Standard $HOME/.bash_history.
Theoden

Wie würde ich $ HISTFILE in verschiedenen Teilen des Profils wiedergeben?

@ NelsonLiu, ist es nicht offensichtlich? Ihr Ziel ist es, zu verfolgen, wann sich etwas $HISTFILEändert. Machen echo $HISTFILESie einfach zwei Surround Ihren Code. Was Sie tun müssen, ist, den Code zu finden, an dem sich $HISTFILEÄnderungen ergeben, indem Sie beide echo $HISTFILEZeilen zeilenweise näher und näher zueinander bewegen , bis etwas sichtbar wird. Das ist alles.
Theoden

1
Also habe ich getan, wie Sie es angewiesen haben, und .bash_profile zum selben Profil gemacht. Ich entschied mich für echo $HISTFILEjede Zeile, nur um zu sehen, ob es irgendwelche Unterschiede gab. Es druckte jedoch nur /Users/username/.bash_historyunzählige Male. Ich lief dann echo $HISTFILEin der Shell, und es gab aus /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.

0

Ich habe dieses Problem in High Sierra gesehen. Irgendwie war meine eigene .bash_history im Besitz von root und hatte nicht einmal Leseberechtigungen für andere Benutzer (wenn der Inhalt des Ausgangsverzeichnisses mit ls -al angezeigt wurde).

Diese .bash_history-Datei hatte keinerlei Konsequenzen, daher habe ich eine sudo rm .bash_history gefolgt von einer Berührung von .bash_history durchgeführt, um eine neue zu erstellen.

Jetzt scheint alles in Ordnung zu sein


Für mich waren es nicht die Dateiberechtigungen, sondern, dass ich keine der HIST-Steuervariablen definiert hatte. Anscheinend müssen einer oder mehrere von ihnen definiert werden. Ich habe dies zu meiner ~/.bash_profileDatei hinzugefügt :export HISTTIMEFORMAT='%F %T '
MarkHu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.