12 votes

Pourquoi Mac Terminal se souvient de deux commandes consécutives alors qu'elles sont identiques ?

J'ai commencé à utiliser Mac récemment et avant je travaillais sur Ubuntu.

Supposons que je lance ces commandes une par une sur mon terminal :

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

Maintenant, supposons que je veuille exécuter python main.py à nouveau, donc je vais cliquer sur la touche haut. Je n'aurai besoin de cliquer sur la touche haut que deux fois sur Ubuntu mais 7 fois sur Mac.

Si deux commandes consécutives sont identiques, alors le terminal doit se souvenir d'une seule commande au lieu de se souvenir de deux commandes différentes.

Comment faire pour que cela se produise sous MacOS ?

14voto

Douglas Points 10417

Vous devez ajouter la variable d'environnement HISTCONTROL à votre code d'accès. .bash_profile . Dans votre .bash_profile ajoutez la ligne suivante :

export HISTCONTROL=ignoreboth:erasedups

Fermez et redémarrez votre session bash et les doublons devraient avoir disparu. Alternativement, vous pouvez simplement exécuter cette même ligne et cela prendra effet pour cette session (utilisez-la pour la tester).


De la page du manuel pour bash (en terminal) :

HISTCONTROL
Une liste de valeurs séparées par deux points contrôlant la façon dont les commandes sont enregistrées dans la liste d'historique. Si la liste de valeurs comprend ignorespace Les lignes qui commencent par un espace ne sont pas enregistrées dans la liste de l'historique. Une valeur de Ignorants fait que les lignes correspondant à l'entrée précédente de l'historique ne sont pas sauvegardées. Une valeur de ignorer les deux est un raccourci pour ignorespace y Ignorants . Une valeur de erasedups fait en sorte que toutes les lignes précédentes correspondant à la ligne courante soient supprimées de la liste de l'historique avant que cette ligne ne soit sauvegardée. Toute valeur ne figurant pas dans la liste ci-dessus est ignorée. Si HISTCONTROL n'est pas défini, ou ne comprend pas de valeur valide, toutes les lignes lues par l'analyseur syntaxique de l'interpréteur de commandes sont enregistrées dans la liste d'historique, sous réserve de la valeur de HISTIGNORE . La deuxième ligne et les lignes suivantes d'une commande composée de plusieurs lignes ne sont pas testées et sont ajoutées à l'historique, quelle que soit la valeur de la variable HISTCONTROL .

4voto

LаngLаngС Points 7522

Pourquoi cela se produit-il ?

MacOS et Ubuntu sont configurés différemment pour gérer les doublons dans l'historique des commandes de bash. Ces configurations sont stockées dans un certain nombre de " Dot-files ". Ceux-ci prennent la forme de ~/.bash* ainsi que du fichier système /etc/profile. Tous ces fichiers peuvent être personnalisés à votre convenance et font la différence entre shells interactifs, shells de connexion, shells distants etc. Ces fichiers sont lus dans un ordre spécifique et remplissent des fonctions spécifiques.

Comment obtenir le même comportement sous MacOS ?

Si vous ne voulez que cette seule et unique personnalisation de l'option "ignorer les doublons exacts des lignes de commande", vous pouvez opter pour quelque chose comme la réponse d'Allan, c'est-à-dire ajouter une seule et unique ligne à votre fichier bash_profile par exemple. Il n'y a pas de "bonne méthode" mais d'innombrables options.

Dans le cas où ce n'est pas la seule personnalisation pour votre bash alors ceci pourrait n'est pas la meilleure option :

Quelques autres notes :

  • Tout ce qui doit être disponible pour les applications graphiques OU pour sh (ou bash invoqué comme sh) DOIT être dans ~/.profile.
  • ~/.bashrc ne doit pas sortir quoi que ce soit
  • Tout ce qui ne doit être disponible que pour les shells de connexion doit aller dans ~/.profile
  • Assurez-vous que ~/.bash_login n'existe pas.

Cela signifie que lorsque les choses deviennent plus complexes, c'est bonne idée à étalé les personnalisations en plusieurs fichiers, chacun d'entre eux étant spécialisé et très ordonné dans son contenu :

Tous exports peuvent résider dans leur propre dossier pour une surveillance simplifiée.

Créez un fichier qui sera lu par bash à la racine de votre répertoire utilisateur, par exemple appelé .exports qui contient :

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

Ceci doit être "sourcé" pour que le fichier soit lu par bash au démarrage interactif :

Fichiers d'approvisionnement
Si vous avez beaucoup de configurations de l'interpréteur de commandes, vous voudrez peut-être les répartir en plusieurs sous-fichiers et utiliser le buildin source pour les charger à partir de votre .bashrc : en ajoutant source ~/.exports à elle.

Alternativement, pour s'assurer que les fichiers existent réellement avant de les charger

if [ -f ~/.exports ]; then
. ~/.exports
fi

La commande . ~/.exports sera source ~/.exports dans le contexte du shell en cours d'exécution.

Ceci est particulièrement utile pour ajouter des alias, le fichier séparé permet de les recharger plus facilement lorsque vous apportez des modifications.

1voto

Zombo Points 121

Il est difficile d'enregistrer de manière unique chaque nouvelle commande. D'abord, vous devez ajouter à ~/.profile ou similaire :

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Ensuite, vous devez ajouter à ~/.bash_logout :

history -a
history -w

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X