Pourquoi la source Mac OS X n’est-elle pas ~ / .bashrc? [dupliquer]

95

Cette question a déjà une réponse ici:

J'ai trouvé beaucoup de gens en train de comprendre pourquoi un enseignement semblable à celui-ci:

Put X to your ~/.bashrc and you can do Y

ne fonctionne pas.

Il s'avère toujours que les fichiers de démarrage de bash de Mac OS X (ou Mac's Bash lui-même) ne génèrent pas le fichier ~ / .bashrc, ni dans le shell de connexion, ni dans un shell généré à partir du système de fenêtre, comme dans l'application Terminal de Mac OS X).

Pourquoi cela, alors que tous les autres systèmes Unash avec Bash avec lesquels j'ai déjà travaillé l'ont déjà fait?

PS:

J'ai trouvé ce que Bash lui-même dit à propos des fichiers de démarrage (ce qui pourrait être utile):

Lorsque Bash est appelé en tant que shell de connexion interactif ou en tant que shell non interactif avec l'option --login, il lit et exécute d'abord les commandes du fichier / etc / profile, si ce fichier existe. Après avoir lu ce fichier, il recherche ~ / .bash_profile, ~ / .bash_login et ~ / .profile, dans cet ordre, puis lit et exécute les commandes à partir de la première qui existe et est lisible. L'option --noprofile peut être utilisée au démarrage du shell pour empêcher ce comportement.

Source: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

Paul Brewczynski
la source
J'ai aussi remarqué que ~/.bash_profilec'est exécuté mais pas ~/.bashrc. Wierd.
igaurav

Réponses:

90

Sous OSX, le terminal démarre par défaut une session de connexion, il lit donc .bash_profile, etc. (Le processus de connexion à l’interface graphique qui vous demande votre nom et votre mot de passe n’utilise pas de scripts shell et ne démarre aucun shell, tout se fait à partir de launchd et de l’espace de travail)

Sur d'autres Unices, xterm exécute un shell autre que de connexion par défaut. Ainsi, ils lisent .bashrc car les scripts qui vous présentent votre mot de passe, etc. lors de la connexion, appellent la session de connexion. Tous les terminaux en subissent le processus et héritent de l'environnement shell.

À partir du document GNU auquel vous avez fait référence

Appelé en tant que shell interactif sans connexion

Lorsqu'un shell interactif qui n'est pas un shell de connexion est démarré, Bash lit et exécute les commandes de ~ / .bashrc, si ce fichier existe. Cela peut être inhibé en utilisant l'option --norc. L'option de fichier --rcfile forcera Bash à lire et à exécuter les commandes d'un fichier à la place de ~ / .bashrc.

Donc, généralement, votre ~ / .bash_profile contient la ligne

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

après (ou avant) toute initialisation spécifique à la connexion.

utilisateur151019
la source
7
Unicies = Unixes?
Paul Brewczynski
8
Eh bien Unices je voulais dire - je me suis penchée latine à l'école afin de supprimer le pluriel - voir en.wikipedia.org/wiki/Unix
user151019
8
... et 3ème forme "Unixen" (bien que je préfère les Unices)
earcam
7
et quatrième "Licornes" ...
tink
8
n'oublions pas la forme nulle, c'est-à-dire "eunuques"
smatthewenglish
19

bashlit seulement .bashrcpour les shells non-login :

Lorsqu'un shell interactif qui n'est pas un shell de connexion est démarré, bash lit et exécute les commandes de ~ / .bashrc, si ce fichier existe. Cela peut être inhibé en utilisant l'option --norc. L'option de fichier --rcfile forcera bash à lire et à exécuter des commandes à partir du fichier au lieu de ~ / .bashrc.

Comme Terminal démarre en bashtant que shell de connexion (exécuté wpour vérifier que les bashinstances sont exécutées en tant que -bash), il .bashrcn'est jamais lu automatiquement.

nohillside
la source
Le fait est que l’application Termina sur Mac OS X crée toujours une instance de "connexion" de bash? Pourquoi ? Si vous ne vous connectez pas vraiment. (Vous avez déjà
ouvert une
Pourquoi les autres systèmes Unix DOIT-ils lire ~ / .bashrc?
Paul Brewczynski
3
Personne ici n’est en mesure d’expliquer les décisions de conception prises par Apple. Je pourrais facilement argumenter des deux côtés mais cela n'aide pas non plus. Alors acceptez-le tel quel est probablement la meilleure option
nohillside
Eh bien, c’est la première fois que vous exécutez le shell comme il s’agit d’un login. Dans les Unices basés sur X11, vous commencez par exécuter le shell qui exécute ensuite X de sorte que ce n’est pas un login
utilisateur151019
@PaulBrewczynski Eh bien, Linux a reçu un appel de .bash_profile à .bashrc.
Paul Stelian