Pourquoi .bashrc ne s'exécute pas automatiquement?

202

Je mets des commandes alias dans mon .bashrcfichier, afin qu'elles puissent être chargées à chaque fois que j'ouvre une nouvelle fenêtre de terminal. Pourtant cela n'arrive pas.

Je dois sélectionner run script:dans le terminal> Préférences> " MyDefaultTheme "> prefpane du shell et ajouter: source .bashrc && clearpour que cela fonctionne ...

Cela semble étrange puisque de nombreux tutoriels indiquent seulement que vous devez simplement ajouter au .bashrcfichier et que tout va bien.

Notez que je ne cours pas bashlorsque j'utilise le terminal, j'aime mieux l'autre (par défaut) (je ne sais pas ce que c'est), car il me montre où je suis tout le temps, par exemple:

>>d54c6b47b:~ romeo$

au lieu de:

>>bash$

En bash tout est chargé comme il se doit.

Ma question est donc la suivante: pourquoi mon .bashrcfichier n’a-t-il pas été chargé automatiquement et dois-je ajouter l’option pour l’appeler à tout moment?

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

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

qui devrait écrire l'alias à mon .bashrc, ça ne marche pas non plus ...

Notez que je suis un novice UNIX, alors soyez gentil.

romeovs
la source
Je pense que c'est très proche de apple.stackexchange.com/questions/7984/… .
boehj
@boehj et bien il est mentionné "pas de chargement .bashrc" mais c'est à peu près tout.
Jari Keinänen le
OK, désolé si j'ai confondu les choses ici.
boehj
Vous aimez probablement csh(ou une autre variante) mieux. Mais vous devez savoir que le >>bash$peut être changé :)
vol7ron
Si vous souhaitez que les commandes soient exécutées , créez-les .profiledans votre répertoire personnel
Kolob Canyon

Réponses:

94

Il suffit de mettre cela dans votre .profilefichier à partir de votre répertoire personnel et cela devrait fonctionner la prochaine fois que vous lancerez un nouveau shell ou après avoir exécuté.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

Cosu
la source
accepté celui-ci parce qu’il a une solution (et c’était le premier de deux postes quasi identiques).
RomeoVs
37
Voté à la baisse. Je 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 exécutent uniquement le script de démarrage de la connexion ~/.bashrc. Cependant, la solution ne consiste pas simplement à placer votre .bashrccontenu 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 consiste à avoir votre ~/.bash_profilesource ~/.bashrcà un moment approprié du script (généralement le dernier).
Chris Page
Je ne vois pas d'autre message identique, il est juste mis dans le fichier sh
Mark
218

Été là, fait ça. Ce dont j'ai eu connaissance, OS X ne lit pas le .bashrcfichier 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 le commentaire informatif et utile de Chris Johnsen :

Par défaut, Terminal démarre le shell via /usr/bin/login, ce qui en fait un shell de connexion. Sur toutes les plateformes (pas seulement Mac OS X) bash n'utilise pas .bashrcpour les shells de connexion (seulement /etc/profileet la première .bash_profile, .bash_login, .profilequi existe et est lisible). C'est pourquoi "mettre source ~/.bashrcdans .bash_profile" est un conseil standard

Je habituellement juste mettre les choses que je normalement mis dans ~/.bashrcà ~/.profile- a travaillé jusqu'à présent comme un charme.

Jari Keinänen
la source
38
Par défaut, Terminal démarre le shell via /usr/bin/login, ce qui en fait un shell de connexion. Sur toutes les plateformes (pas seulement Mac OS X) bash n'utilise pas .bashrcpour les shells de connexion (seulement /etc/profileet la première .bash_profile, .bash_login, .profilequi existe et est lisible). C'est pourquoi «mettre source ~/.bashrcdans votre .bash_profile» est un conseil standard.
Chris Johnsen
5
Re "Je mets généralement juste les choses que je mettrais normalement dans ~ / .bashrc à ~ / .profile": Pour une compatibilité maximale, je vous recommande de suivre les conseils de Chris Johnsen et de placer tout ce que vous souhaitez appliquer aux shells autres que de connexion. ~ / .bashrc et ajoutez "source ~ / .bashrc" à votre ~ / .bash_profile pour l'exécuter pour les shells de connexion. Sinon, cela ne fonctionnera pas pour les sous-shells, ou si Terminal change pour créer des shells autres que de connexion, ou si vous utilisez xterm ou un autre programme de terminal créant par défaut des shells non-de connexion, ou si vous souhaitez utiliser même configuration sur un autre OS.
Chris Page
4
Sur une note connexe, sous Mac OS X, vous devriez envisager de faire exécuter / / bashrc / etc / bashrc pour détecter les comportements globaux. En particulier, il existe un 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 de Resume et des groupes de fenêtres.
Chris Page
Pour moi, le sourcing .bashrc à partir de .bash_profile n'a pas fonctionné. Mais le sourcing .bashrc / .bash_profile à partir de .profile a fonctionné.
Ken Russell
2
Bonne réponse mais un peu mal informée. Je crois que les charges de terminaux bash que l' un des ~/.bash_profile, ~/.profile, ~/.bash_login, jamais tous les eux. Vous pouvez exécuter un test simple en créant les 3 fichiers. Il semble que le terminal bash a la préférence de ~/.bash_profile> ~/.bash_login> ~/.profile. Si quelqu'un d'entre eux existe, ceux de moindre préférence sont ignorés. C’est pourquoi il est parfois recommandé de s’approvisionner également ~/.profileen ~/.bash_profile.
Neurite
25

Je mets tout dans ~/.bashrcet juste source ~/.bashrcdans .profile.

Cela permet aux sessions screen et xterm (et je suppose tmux) d'hériter de mon environnement, car seules les sessions sans connexion sont exécutées .bashrc, alors que les sessions de connexion (par exemple, terminal ou iTerm) sont uniquement exécutées .profile.

anu
la source
1
Ceci est mon approche. De cette façon, je peux maintenir un fichier .bashrc qui fonctionne sur les deux systèmes ... et je peux mettre dans mon fichier .bash_profile des éléments spécifiques à un Mac, tels que des alias uniquement destinés au travail (où j'utilise le plus souvent le fichier mac).
Michael Durrant
2
Notez que cela .profileest commun à plusieurs shells et ne devrait contenir que du code sh compatible POSIX. Si elle est source, .bashrcelle contient probablement du code spécifique à Bash (l'existence du .bashrcfichier est spécifique à Bash). Je recommande de renommer votre .profileen .bash_profilepuisque vous l'utilisez de manière spécifique à Bash. Ou, mettre le code générique .profileet créer une .bash_profileque les sources .profileet .bashrc.
Chris Page
19

Il y a deux scénarios:

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

Pour les deux, vous voulez que la source ~/.bashrcde votre profil soit chargée ou sourcée au démarrage de votre shell pour votre terminal.


LINUX

Sous Linux, ~/.profilela source est automatiquement dans votre shell au démarrage. Donc, si vous allez sur 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. Ceci est le fichier qui est automatiquement "recherché" lorsque vous démarrez le terminal.

Si vous souhaitez ajouter des alias et des fonctions à ~/.bashrc(ce que je fais), vous devriez alors (à l'intérieur de, ~/.profileajouter une instruction if qui vérifie s'il ~/.bashrcs'agit d'un fichier non vide, puis le source.

Pour vérifier si votre ~/.profiledéjà fait cela entrer 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 vous en servir). Vous pouvez obtenir un fichier texte vide (vous ne devriez pas), mais si vous le faites simplement, continuez. Si vous ne voyez pas une ligne nulle part qui dit source ~/.bashrc, puis entrez les lignes suivantes quelque part ( le mettre dans un endroit raisonnable comme à la fin ou au début et non pas au milieu d'une instruction if):

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

Ceci vérifie si ~/.bashrcest un fichier non vide (avec if [ -s ~/.bashrc ]), et si c'est le cas, il le source. Assez simple. Maintenant, vous pouvez ajouter n'importe quel alias, fonction, variable, etc. valide à ~/.bashrc.


MAC OS X

Par défaut, les sources Max OS X ~/.bash_profile. Pour pouvoir ajouter des éléments à ~/.bashrc(ce qui est, encore une fois, ce que je fais sous OS X également), vous suivez alors la même procédure que linux. Dans le terminal entrez cd ~; nano .bash_profile. Recherchez une ligne qui dit source ~/.bashrcet si ce n'est pas là, ajoutez l'instruction if ci-dessus ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi).


REMARQUES

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

Si vous voulez savoir comment vérifier les éléments dans une instruction if, rendez-vous au terminal et entrez-le man \[; cela vous donne essentiellement la fin d'une instruction if. Par exemple, if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fivérifie s'il /path/to/files'agit d'un fichier et s'il est imprimé sur stdout en conséquence. Je fais toujours référence à cela aussi pour faciliter la lecture et une référence rapide: 7.2. Opérateurs de test de fichiers .

J'espère que ça aide. Je me souviens à quel point j'étais confus au début de tout ça (ce qui n’était pas si tôt) alors, bonne chance dans vos futurs projets UNIX!

Dylan
la source
Sur linux, .profileprovient uniquement si votre shell est un shell de connexion, sinon il .bashrcprovient
smac89
11

La recherche de .profile dans .bash_profile l'a fait pour moi

echo 'source ~/.profile' >> ~/.bash_profile
Luis S
la source
1
Rechercher un fichier .profile dans .bash_profile est une excellente chose à faire, mais cela ne suffirait pas à faire que .bashrc soit exécuté par des shells de connexion. Votre fichier .profile doit avoir déjà créé le fichier .bashrc, ce qui pourrait poser problème si vous utilisez un shell autre que bash. La plupart des utilisateurs de Mac ne le feront jamais, mais si vous le faites pour une raison quelconque, souvenez-vous de ceci. :)
Terry N
Pour développer ce que @TerryN a dit: assurez-vous de vous procurer .bashrcvotre source .bash_profileet non de vous .profile. .bash_profileest spécifique à Bash et devrait utiliser les deux autres sources.
Chris Page
6

J'ai constaté qu'après l'installation de rvm (installateur automatique, aucune modification manuelle), il avait créé un ~/.bash_loginfichier pour lui-même, alors que je n'en avais jamais eu auparavant.

Cependant, cela signifie que mes ~/.profileconfigurations et mes alias ne sont plus chargés! Beaucoup de raccourcis ont disparu. Je pensais qu'ils fonctionnaient séquentiellement, pas exclusivement: - /

J'ai ajouté

. ~/.profile 

d' ~/.bash_loginenchaîner les choses comme je m'y attendais.

Dman
la source
+1, c'est la situation que j'ai eue. J'ai constaté que .bash_login ou .bash_profile empêcherait l'exécution de .profile ... Aucune idée de la raison pour laquelle bash ressent le besoin d'avoir autant de fichiers de démarrage en conflit.
RichVel
.profileest commun à plusieurs shells différents et ne doit contenir que du code sh compatible POSIX. .bash_profileest spécifique à Bash et peut contenir du code spécifique à Bash. En général, si vous utilisez Bash, vous devriez préférer, à .bash_profilemoins que vous ne preniez soin de vous assurer que votre code de démarrage ne contient rien qui dépend de Bash. Quel que soit le programme créé, il l’a .bash_loginprobablement fait car il contient du code spécifique à Bash, mais il aurait dû inclure du code à la source .profiles’il existe.
Chris Page
3

En mettant...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... in ~/.bashrc, puis la source ~/.bashrcdans mon ~/.bash_profile ne fonctionne pas pour le programme Terminal qui est installé.

Mais ensuite, je suis allé dans le menu déroulant Edition> Préférences de profil , onglet Titre et commande , puis j'ai sélectionné Exécuter la commande en tant que shell de connexion dans la section commande de cette page.

Après cela, le démarrage d’un nouveau terminal affiche le résultat souhaité lorsque je tape

 type rvm|head -1

c'est-à-dire "rvm est une fonction". Il ne l'a pas fait avant d'avoir apporté ce changement, et c'est le seul changement que j'ai apporté après le .bash_profileet les .bashrcchangements décrits dans d'autres réponses ici.

LiquidMark
la source
2

Tout d’abord, laissez-moi vous dire que ~/.bashrcc’est le fichier qui est exécuté chaque fois qu’un deuxième shell est appelé (lors de l’exécution d’un script shell, par exemple) et qui ~/.profileest appelé à chaque connexion.

Je vous recommande donc d’écrire une . ~/.bashrccommande dans votre ~/.profilefichier, et cette commande exécutera le fichier bashrc à chaque fois que vous vous connecterez.

Arun Rana
la source
Lorsque .profile est exécuté lors de la connexion, il exécute automatiquement le fichier .bashrc.
Arun Rana
donc .bashrc est exécuté indirectement à chaque connexion
arun rana
1
bashrc est destiné aux shells non connectés. bash_profile / bash_login / profile / quoi que ce soit d'autre pour les shells de connexion. C'est une source de conflit énorme, impliquant ce qui est et n'est pas un shell de connexion (une session screen / tmux par exemple, un terminal dans un environnement de bureau, etc.). Ce n'est pas nécessairement la "deuxième coquille". C'est une question d'entrée dans le shell.
Jason Salaz
3
Si vous utilisez un shell autre que Bash, vous risquez de rencontrer des problèmes si vous le décrivez. .profile s'applique à tous les shells et .bashrc peut contenir un langage que certains autres shells ne comprennent pas. Au lieu de .profile, mettez ce que vous avez écrit dans .bash_profile. (En outre, faites que la première chose que .bash_profile soit "source .profile".)
Terry N
1

J'ai rencontré le même problème après avoir installé rbenv sur mon serveur distant (Digital Ocean) Ubuntu 16.04.

Il a en quelque sorte créé ~/.bash_profile. C'est la même chose ~/.bashrcsur un système OS X.

Et Ubuntu a commencé à lire uniquement ~/.bash_profile, mais pas ~/.bashrccomme il se doit.

Donc, je viens de sauvegarder mes données ~/.bash_profileavec ceci:

mv ~/.bash_profile ~/.bash_profile.bak

Et renommé l'ancien ~/.bashrcen~/.bash_profile

mv ~/.bashrc ~/.bash_profile

Cela a fonctionné pour moi. Après ma connexion SSH, tout est chargé ~/.bashrc.

zhisme
la source
0

Au cas où cela pourrait aider quelqu'un d'autre ...

Assurez-vous que vous éditez le bon .bashrcfichier pour le bon utilisateur. J'ai eu un problème similaire en utilisant Vagrant. Après avoir exécuté vagrant sshmon .bashrcfichier n'était pas en cours d'exécution. La solution était simple en ce sens que je pensais que vagrant se connectait avec l'utilisateur nommé vagrant et que je me connectais en tant qu'un autre utilisateur. Donc, je montais le mauvais .bashrcfichier. Après avoir édité le .bashrcfichier correct , mes alias ont été reconnus.

Allen
la source
-1

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

Donc, tous ces ~/.bashrcfichiers ne sont pas chargés.

Vous devez définir vos alias à la ~/.zshrcplace.

Frédéric Adda
la source
-2

Pour conserver la connexion de style OSX .profileet prendre en charge le comportement bash normal, .bashrcvous pouvez utiliser un .bashrcfichier si vous basculez entre nix normal et OSX en fournissant un lien symbolique vers votre .bashrcfichier appelé .bash_profile. Assurez-vous simplement que ce fichier n'existe pas avant de l'essayer, mais c'est comme ça que je le fais.

ln -s .bashrc .bash_profile
Encre
la source
En faisant cette liaison entre 2 scripts d'initialisation de shell différents, vous perdez une séparation de fonction nécessaire. Un jour ou l'autre, vous aurez besoin d'une initialisation au niveau de la session ( .bash_profile) et d'une initialisation différente à chaque niveau de shell ( .bashrc).
dan
-2

/ etc / bashrc est destiné aux profils globaux sur les systèmes mac. Vous pouvez ajouter: alias ls = "ls -G" en haut de ce fichier et votre contenu, tout le monde aura des fichiers et des dossiers colorisés sur le système, de sorte que vous ne devrez rien ajouter de plus pour chaque utilisateur. Vous remarquerez également que "sudo su -" vous permet de conserver des fichiers et des dossiers colorisés sans autre problème.

Autre astuce amusante: lors de l’utilisation de Iterm2 pour mac, l’importation de profils de couleur rendra la coloration des fichiers et des dossiers immédiatement en fonction de votre jeu de couleurs, une fois l’option "/ etc / bashrc" définie.

Sulayman Touray
la source