281 votes

Pourquoi le fichier .bashrc ne s'exécute-t-il pas automatiquement ?

J'ai mis des commandes alias dans mon .bashrc afin qu'ils soient chargés chaque fois que j'ouvre une nouvelle fenêtre de terminal. Pourtant, cela ne se produit pas.

Je dois sélectionner run script: dans le Terminal>Préférences>" MonThèmeParDéfaut ">Préfane shell et ajouter : source .bashrc && clear pour qu'il fonctionne...

Cela semble étrange car de nombreux tutoriels indiquent qu'il suffit d'ajouter à la section .bashrc et tout va bien.

Notez que je ne cours pas dans bash lorsque j'utilise le terminal, je préfère l'autre (par défaut) (je ne sais pas ce que c'est), parce qu'il me montre où je suis tout le temps, par exemple :

>>d54c6b47b:~ romeo$

à la place de :

>>bash$

Dans bash tout est chargé comme il se doit.

Donc ma question est, pourquoi mon .bashrc se charge automatiquement et ai-je dû ajouter l'option pour l'appeler à chaque fois ?

De plus, un tutoriel m'a dit de faire quelque chose comme :

$alias la=’ls -la’ >> ~/.bashrc

qui devrait écrire l'alias dans mon .bashrc cela ne fonctionne pas non plus...

Notez que je suis un novice en matière d'UNIX, alors soyez indulgent.

0 votes

Je pense que c'est très proche de apple.stackexchange.com/questions/7984/ .

1 votes

Si vous utilisez plutôt l'option par défaut zsh shell (pas i.e : bash ) configuré dans OS X 2019+ (actuellement Catalina), voir apple.stackexchange.com/a/338622/192005

0 votes

@mmmmmm j'ai annulé votre édition. La question porte clairement sur bash, et il y a même des réponses récentes indiquant que zsh fonctionne différemment.

291voto

Tundey Points 2145

Je suis passé par là, j'ai fait ça. Ce dont je me suis rendu compte, c'est que OS X ne lit pas .bashrc au démarrage de bash. Au lieu de cela, il lit les fichiers suivants (dans l'ordre suivant) :

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

Voir aussi Chris Johnsen Le commentaire informatif et utile de l'auteur :

Par défaut, Terminal lance le shell via /usr/bin/login ce qui fait du shell un shell de connexion. Sur toutes les plateformes (pas seulement Mac OS X) bash n'utilise pas .bashrc pour les shells de connexion (seulement /etc/profile et le premier de .bash_profile , .bash_login , .profile qui existe et qui est lisible). C'est pourquoi "put source ~/.bashrc dans votre .bash_profile "est un conseil standard

I d'habitude, je mets juste les choses que je mettrais normalement dans ~/.bashrc à ~/.profile - a fonctionné jusqu'à présent comme un charme.

58 votes

Par défaut, Terminal lance le shell via /usr/bin/login ce qui fait du shell un shell de connexion. Sur toutes les plateformes (pas seulement Mac OS X) bash n'utilise pas .bashrc pour les shells de connexion (seulement /etc/profile et le premier de .bash_profile , .bash_login , .profile qui existe et qui est lisible). C'est pourquoi "put source ~/.bashrc dans votre .bash_profile " est un conseil standard.

7 votes

Re "Je mets généralement les choses que je mettrais normalement dans ~/.bashrc dans ~/.profile" : Pour une compatibilité maximale, je vous recommande de suivre les conseils de Chris Johnsen et de placer tout ce que vous voulez appliquer aux shells de non-login dans ~/.bashrc et d'ajouter "source ~/.bashrc" à votre ~/.bash_profile pour l'exécuter pour les shells de login. Sinon, cela ne fonctionnera pas pour les sous-shells, ou si Terminal est modifié pour créer des shells de non-login, ou si vous utilisez xterm ou un autre programme de terminal qui crée des shells de non-login par défaut, ou si vous voulez utiliser la même configuration sur un autre OS.

4 votes

Dans le même ordre d'idées, sous Mac OS X, vous devriez envisager de faire en sorte que ~/.bashrc exécute /etc/bashrc pour récupérer les comportements globaux. En particulier, il y a du code dans /etc/bashrc pour mettre à jour le répertoire de travail à chaque invite, ce qui permet à Terminal d'afficher l'icône du proxy, de créer de nouveaux terminaux dans le même répertoire et de restaurer le répertoire de travail pour les groupes Reprise et Fenêtre.

125voto

Cosu Points 1636

Mettez juste ça dans votre .profile de votre répertoire personnel et il devrait fonctionner la prochaine fois que vous démarrez un nouveau shell ou après avoir exécuté le programme source ~/.profile

Ce lien indique clairement l'ordre dans lequel les fichiers de démarrage sont lus et chargés par le shell : http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup

0 votes

A accepté celui-ci parce qu'il a une solution (et c'était le premier de deux posts presque identiques).

60 votes

Voté à la baisse. Je vous déconseille de suivre ce conseil. Le problème est que Terminal crée des shells de connexion, et que les shells de connexion Bash seulement exécuter le script de démarrage de la connexion, et non pas ~/.bashrc . Cependant, la solution n'est pas de simplement placer votre .bashrc dans le fichier de démarrage de la connexion, car ces deux fichiers sont destinés à effectuer différents types de configuration. Au lieu de cela, la configuration canonique pour Bash est d'avoir le fichier ~/.bash_profile source de votre ~/.bashrc à un moment approprié dans le script (généralement en dernier).

0 votes

Je ne vois pas d'autre message identique, il est juste dit de mettre le fichier sh.

35voto

reefnet_alex Points 5850

J'ai tout mis dans ~/.bashrc et juste source ~/.bashrc dans .profil.

Cela permet aux sessions screen et xterm (et je suppose tmux) d'hériter de mon environnement alors que les sessions non-login n'exécutent que .bashrc alors que les sessions de connexion (par exemple, terminal ou iTerm) ne font qu'exécuter .profile .

1 votes

Voici mon approche. De cette façon, je peux maintenir un .bashrc qui fonctionne sur les deux systèmes... et je peux mettre tous les trucs spécifiques au mac ou les trucs comme les alias qui sont seulement pour le travail (où j'utilise le mac le plus) dans mon fichier .bash_profile.

6 votes

Notez que .profile est commun à plusieurs shells et ne devrait contenir que du code sh compatible POSIX. S'il source .bashrc on peut soutenir qu'il contient du code spécifique à Bash (l'existence de l'élément .bashrc est spécifique à Bash). Je vous recommande de renommer votre .profile à .bash_profile puisque vous l'utilisez d'une manière spécifique à Bash. Ou bien, mettez le code générique dans .profile et créer un .bash_profile que les sources .profile y .bashrc .

24voto

Dylan Points 469

Il existe deux scénarios :

  1. Vous utilisez Linux
  2. Vous utilisez Mac Os X

Pour les deux, vous voulez vous approvisionner ~/.bashrc dans votre profil qui est chargé, ou sourcé, lorsque votre shell pour votre terminal démarre.


LINUX

Dans Linux, ~/.profile est automatiquement source dans votre shell lorsqu'il démarre. Ainsi, si vous allez dans votre terminal et tapez cd ~; ls -A vous verrez tous vos fichiers et répertoires dans votre répertoire personnel ( /home/usrname/ ). Vous devriez voir un fichier appelé .profile . C'est le fichier qui est automatiquement "sourcé" lorsque vous démarrez le terminal.

Si vous souhaitez ajouter des alias et des fonctions à l'application ~/.bashrc (c'est ce que je fais), alors vous devriez (à l'intérieur de l'élément ~/.profile ajouter une instruction if qui vérifie si ~/.bashrc est un fichier non vide, puis le source.

Pour vérifier si votre ~/.profile fait déjà cette entrée nano ~/.profile . Cela l'ouvrira dans un éditeur de texte (vous pouvez utiliser gedit si vous savez que vous l'avez ou même vim si vous savez l'utiliser). Vous obtiendrez peut-être un fichier texte vide (vous ne devriez pas), mais si c'est le cas, continuez simplement. Si vous ne voyez pas de ligne partout qui dit source ~/.bashrc puis entrez les lignes suivantes quelque part (placez-les à un endroit raisonnable comme à la fin ou au début et non au milieu d'une instruction if) :

if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

Cela permet de vérifier si ~/.bashrc est un fichier non vide (avec si [ -s ~/.bashrc ] ), et s'il est tel, il le source. C'est très simple. Maintenant, vous pouvez ajouter n'importe quel alias valide, fonction, variable, etc à ~/.bashrc .


MAC OS X

Par défaut (avant 2019 Catalina), les sources Mac OS X ~/.bash_profile . Pour pouvoir ajouter des choses à ~/.bashrc (ce qui est, encore une fois, ce que je fais dans OS X, aussi), alors vous suivez la même procédure que linux. Dans le terminal, entrez cd ~; nano .bash_profile . Vérifiez si une ligne indique source ~/.bashrc et s'il n'est pas là, ajoutez l'instruction if ci-dessus ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi ).


NOTES

Lorsque vous écrivez une instruction if, veillez à laisser des espaces entre pratiquement tout (par exemple if [ -s ~/.bashrc]; then echo "found"; fi ne fonctionne pas parce qu'il n'y a pas d'espace entre ~/.bashrc y ] - l'interprète pensera qu'il s'agit d'un seul mot).

Si vous voulez mieux comprendre comment vérifier des choses dans une instruction if, allez dans le terminal et entrez man \[ cela vous donne essentiellement le déroulement d'une instruction if. Par exemple, if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fi vérifie si /path/to/file est un fichier et s'il l'est, il imprime sur stdout en conséquence. Je fais toujours référence à ceci pour une référence rapide et plus facile à voir : 7.2. Opérateurs de test de fichiers .

J'espère que cela vous aidera. Je me souviens à quel point j'étais confus lorsque j'ai commencé tout cela (il n'y a pas si longtemps) ; alors, bonne chance dans vos futurs projets UNIX !

0 votes

Sur linux, .profile est seulement utilisé si votre shell est un shell de connexion, autrement .bashrc a pour origine

1 votes

Si vous utilisez plutôt l'option par défaut zsh shell (pas i.e : bash ) configuré dans OS X 2019+ (actuellement Catalina), voir apple.stackexchange.com/a/338622/192005

0 votes

Cela a marché pour moi. Merci

21voto

Frédéric Adda Points 384

Au fait, si vous avez activé ZSH, il remplace bash !

Donc toutes ces ~/.bashrc ne sont pas chargés.

Vous devez définir vos alias dans ~/.zshrc à la place.

0 votes

Merci. Je ne sais pas pourquoi il y a eu un downvote. Tout le reste ne fonctionnait pas pour moi et je ne pensais pas que ZSH était le problème.

0 votes

Merci ! C'était à 100% le problème pour moi.

2 votes

Et sur Mac OS X 2019+ (Catalina actuellement), zsh est l'interpréteur de commandes par défaut (aucune activation nécessaire) (au lieu de bash ) ;)

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