web-dev-qa-db-fra.com

Comment désactiver les sessions Bash sous OS X El Capitan

Une fonctionnalité apparemment nouvelle dans OS X El Capitan (10.11 Beta) est Bash sessions (sessions Terminal) . J'ai maintenant un répertoire ~/.bash_sessions avec des fichiers d'historique et mes envars HISTFILE et HISTIGNORE sont remplacés. Comment puis-je désactiver toutes ces fonctionnalités?

35
Whymarrh

Ce comportement est défini dans /etc/bashrc_Apple_Terminal. Il contient des commentaires sur la documentation décrivant ce qu’il fait et comment le personnaliser.

Vous pouvez désactiver la fonctionnalité d'historique des commandes par session-terminal en définissant Shell_SESSION_HISTORY=0 dans votre script ~/.bashrc, comme décrit ci-après:

Vous pouvez désactiver ce comportement et partager un seul historique en définissant Shell_SESSION_HISTORY à 0. Il existe quelques personnalisations utilisateur courantes qui organise le partage de nouvelles commandes entre les shells en cours d'exécution par manipuler l'historique à chaque invite, et ils incluent généralement 'shopt -s histappend'; Par conséquent, si l’option histappend Shell est activé, l'historique par session est désactivé par défaut. Tu peux l'activer explicitement en définissant Shell_SESSION_HISTORY sur 1.

Notez que, bien que vous puissiez désactiver l'intégralité du mécanisme de restauration de l'état de la session en créant ~/.bash_sessions_disable, il est inutile de désactiver simplement la fonctionnalité d'historique des commandes par session, ce qui n'est pas recommandé.

25
Chris Page

Si vous démarrez manuellement une nouvelle session Bash (à savoir bash -xl), vous pouvez voir ce qui est exécuté lors de la connexion.

Vous verrez la ligne suivante dans la sortie:

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

Vous pouvez créer un fichier .bash_sessions_disable dans votre répertoire de base pour désactiver cette fonctionnalité.

43
Whymarrh

Pour résumer, cela a à voir avec la fonctionnalité Resume de Apple. Lorsque cette fonctionnalité est activée, lorsque vous quittez une application ou redémarrez, la prochaine fois que l'application sera ouverte, elle ouvrira les fenêtres précédemment ouvertes. 

En ce qui concerne Terminal, trois choses doivent être en place pour que cela se produise:

  1. $HOME/.bash_sessions_disable doit pas être présent
  2. System Preferences/General/Close Windows when quitting an app doit pas être coché. 
  3. Lors du redémarrage, sélectionnez Reopen windows.

Lorsque vous rouvrez le terminal, il rouvrira les mêmes fenêtres et onglets que vous aviez auparavant dans les mêmes positions d'écran. De plus, si vous avez coché Terminal/Preferences/your-window-type/Windows/Resume/Restore-text-when-reopening-windows, le texte sera restauré sur chaque écran.

Enfin, et cela concerne spécifiquement la question du PO, celui-ci restaurera l'historique dans chaque fenêtre/onglet si les conditions suivantes sont remplies:

  1. Shell_SESSION_HISTORY est non défini ou défini sur 1
  2. shopt histappend n'est pas défini
  3. HISTTIMEFORMAT n'est pas défini

Si Shell_SESSION_HISTORY est explicitement défini sur 1 dans .bashrc, les deux dernières conditions requises sont remplacées, c'est-à-dire que shopt histappend ou HISTTIMEFORMAT peut être défini. 

De plus, il convient de prêter attention aux variables HISTSIZE et HISTFILESIZE. Ils ne doivent pas être trop gros ou trop petits, et certains conseillent de les laisser non configurés pour qu'ils prennent les valeurs par défaut d’Apple. 

6
chetstone

Tout ce qui a été écrit jusqu'à présent sur ce sujet est exact et utile, et les techniques déjà mentionnées devraient être utilisées à la place. Je vais parler d'une approche totalement nucléaire, uniquement pour divertir les alternatives, mais aussi pour approfondir la compréhension de ce sujet.

La seule raison pour laquelle j'ai acquis cette connaissance est tout simplement parce que je cherchais une solution alternative à la nécessité de créer un fichier ~/.bash_sessions_disable; J'aurais plutôt préféré éviter que le comportement des sessions ne se produise en ajoutant simplement quelques lignes à mon ~/.bash_profile existant. Malheureusement, cela n’est pas possible sans le nucléaire, la réponse officielle reste donc la meilleure approche.

Résumé

Lorsque Bash démarre pour la première fois sur MacOS, il commence par générer /etc/profile, qui à son tour génère /etc/bashrc. Le contenu de ce fichier comprend cette ligne:

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

La variable d'environnement $TERM_PROGRAM est uniquement définie par l'application Terminal d'Apple. Imprimer la valeur de cette variable retourne Apple_Terminal. En d'autres termes, le fichier /etc/bashrc tente de créer un fichier /etc/bashrc_Apple_Terminal s'il existe et qu'il est lisible. C'est dans ce fichier que MacOS effectue sa gestion de session Bash spéciale pour se lier aux fonctionnalités de reprise du système d'exploitation.

Après tout cela, Bash recherchera toutes les configurations d’un utilisateur dans son répertoire personnel (comme ~/.bash_profile ou ~/.bashrc). Ceci étant dit, il n’ya aucun moyen de remplacer tout le travail effectué dans le fichier /etc/bashrc_Apple_Terminal au niveau purement de la configuration (par opposition à la configuration et la création d’un nouveau fichier) sans effectuer ce que les autres ont mentionné, à savoir définir $Shell_SESSION_HISTORY sur 0 pour éliminer l'historique de session et créer un ~/.bash_sessions_disable pour empêcher la création du répertoire .bash_sessions à chaque démarrage du terminal Apple.

Approche nucléaire

Les deux alternatives possibles pour éliminer toute nouvelle fonctionnalité MacOS seraient 1) de supprimer la dernière ligne du fichier /etc/bashrc ou 2) de renommer ou de supprimer le /etc/bashrc_Apple_Terminal en un autre. 

Après cela, l'application Terminal d'Apple ne se comportera plus différemment des émulateurs de terminal non Apple.

0
danemacmillan