it-swarm.com.de

Wie kann ich Bash-Sitzungen in OS X El Capitan deaktivieren?

Eine scheinbar neue Funktion in OS X El Capitan (10.11 Beta) sind Bash-Sitzungen (Terminalsitzungen) . Ich habe jetzt ein ~/.bash_sessions-Verzeichnis mit Verlaufsdateien, und meine HISTFILE- und HISTIGNORE-Envars werden überschrieben. Wie kann ich alle diese Funktionen deaktivieren?

35
Whymarrh

Dieses Verhalten ist in /etc/bashrc_Apple_Terminal definiert. Es enthält Dokumentationskommentare, die beschreiben, was es tut und wie es angepasst werden kann.

Sie können die Befehlsverlaufsfunktion pro Terminalsitzung deaktivieren, indem Sie Shell_SESSION_HISTORY=0 in Ihrem ~/.bashrc-Skript wie hier beschrieben einstellen:

Sie können dieses Verhalten deaktivieren und einen einzelnen Verlauf freigeben, indem Sie Shell_SESSION_HISTORY auf 0. Es gibt einige allgemeine Benutzeranpassungen Dadurch können neue Befehle über .__ unter laufenden Shells gemeinsam genutzt werden. Manipulation der Historie an jeder Eingabeaufforderung, und sie enthalten normalerweise 'shopt -s histappend'; Wenn also die histappend-Shell-Option .__ ist. aktiviert ist, ist der Sitzungsverlauf standardmäßig deaktiviert. Du darfst Aktivieren Sie es explizit, indem Sie Shell_SESSION_HISTORY auf 1 setzen.

Obwohl Sie den gesamten Mechanismus zum Wiederherstellen des Sitzungszustands durch Erstellen von ~/.bash_sessions_disable deaktivieren können, ist dies nicht erforderlich, nur um die Befehlsverlaufsfunktion pro Sitzung zu deaktivieren.

25
Chris Page

Wenn Sie eine neue Bash-Sitzung manuell starten (d. H. bash -xl), können Sie sehen, was beim Anmelden ausgeführt wird.

In der Ausgabe wird folgende Zeile angezeigt:

....
+++ '[' '!' -e /Users/username/.bash_sessions_disable ']'

Sie können eine .bash_sessions_disable-Datei in Ihrem Basisverzeichnis erstellen, um diese Funktion zu deaktivieren.

43
Whymarrh

Zusammenfassend hat dies mit Apples Resume Feature zu tun. Wenn diese Funktion aktiviert ist, wenn Sie eine App beenden oder neu starten, werden beim nächsten Öffnen der App die zuvor geöffneten Fenster geöffnet. 

In Bezug auf das Terminal müssen drei Dinge vorhanden sein, damit dies geschehen kann:

  1. $HOME/.bash_sessions_disable muss nicht vorhanden sein
  2. System Preferences/General/Close Windows when quitting an app muss nicht überprüft werden. 
  3. Wählen Sie beim Neustart Reopen windows.

Wenn Sie das Terminal erneut öffnen, werden dieselben Fenster und Registerkarten an denselben Bildschirmpositionen geöffnet. Wenn Sie Terminal/Preferences/your-window-type/Windows/Resume/Restore-text-when-reopening-windows aktiviert haben, wird der Text auf jedem Bildschirm wiederhergestellt.

Schließlich, und dies bezieht sich speziell auf die Frage des OP, wird der Verlauf in jedem Fenster/Register wiederhergestellt, wenn die folgenden Bedingungen erfüllt sind:

  1. Shell_SESSION_HISTORY ist nicht gesetzt oder auf 1 gesetzt
  2. shopt histappend ist nicht gesetzt
  3. HISTTIMEFORMAT ist nicht gesetzt

Wenn Shell_SESSION_HISTORY in .bashrc explizit auf 1 gesetzt ist, werden die letzten beiden Anforderungen überschrieben, dh shopt histappend oder HISTTIMEFORMAT können gesetzt werden. 

Zusätzlich muss auf die Variablen HISTSIZE und HISTFILESIZE geachtet werden. Sie sollten nicht zu groß oder zu klein sein. Einige raten, sie nicht festgelegt zu lassen, sodass sie die Standardwerte von Apple verwenden. 

6
chetstone

Alles, was bisher über dieses Thema geschrieben wurde, ist zutreffend und nützlich, und stattdessen sollten die bereits erwähnten Techniken verwendet werden. Ich möchte einen völlig nuklearen Ansatz erwähnen, nur um Alternativen zu unterhalten und um das Verständnis für dieses Thema zu erweitern.

Der einzige Grund, warum ich dieses Wissen erworben habe, ist einfach, weil ich nach einer alternativen Lösung gesucht habe, um eine ~/.bash_sessions_disable-Datei erstellen zu müssen. Stattdessen hätte ich lieber das Sitzungsverhalten verhindert, indem ich einfach zu meinem bestehenden ~/.bash_profile ein paar Zeilen hinzufügte. Unglücklicherweise ist dies nicht ohne Atomkraft möglich, daher ist die offizielle Antwort immer noch die beste Lösung.

Zusammenfassung

Wenn Bash zum ersten Mal unter MacOS gestartet wird, wird zunächst /etc/profile als Quelle angegeben, die wiederum /etc/bashrc verwendet. Der Inhalt dieser Datei enthält folgende Zeile:

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

Die Umgebungsvariable $TERM_PROGRAM wird nur von Apples Terminal-App festgelegt. Wenn der Wert dieser Variablen ausgegeben wird, wird Apple_Terminal zurückgegeben. Mit anderen Worten, die /etc/bashrc-Datei versucht, eine /etc/bashrc_Apple_Terminal-Datei zu quellen, wenn beide vorhanden und lesbar ist. In dieser Datei führt MacOS sein spezielles Bash-Session-Handling aus, um die Resume-Funktionen des Betriebssystems zu nutzen.

Nach all dem liefert Bash alle Konfigurationen, die ein Benutzer in seinem Home-Verzeichnis hat (wie ~/.bash_profile oder ~/.bashrc). Es sei darauf hingewiesen, dass es nicht möglich ist, alle in der /etc/bashrc_Apple_Terminal-Datei durchgeführten Arbeiten auf einer reinen Konfigurationsebene (gegenüber beiden Konfigurationen und, die eine neue Datei erstellen) außer Kraft zu setzen, ohne das zu tun, was die anderen erwähnt haben, nämlich $Shell_SESSION_HISTORY auf 0 setzen. Um den sitzungsbasierten Verlauf zu vermeiden, erstellen Sie einen ~/.bash_sessions_disable, um zu verhindern, dass das .bash_sessions-Verzeichnis bei jedem Start von Apple Terminal erstellt wird.

Nuklearer Ansatz

Die zwei möglichen Alternativen zum Beseitigen dieser neuen MacOS-Funktionen bestehen darin, entweder 1) die letzte Zeile aus der /etc/bashrc-Datei zu entfernen oder 2) den /etc/bashrc_Apple_Terminal in etwas anderes umzubenennen oder zu löschen. 

Die Terminal-App von Apple verhält sich danach nicht mehr anders als die Terminalemulatoren von Drittanbietern.

0
danemacmillan