Cette question a déjà une réponse ici:
- Différence entre .bashrc et .bash_profile 6 réponses
Ceci est gênant, mais après de nombreuses années d'utilisation des systèmes POSIX temps plein, il me reste encore du mal à comprendre si une personnalisation du shell devrait aller .bashrc
, .profile
ou ailleurs. Sans parler de certains fichiers de configuration spécifiques au système d'exploitation, tels que .pam_environment
.
Oui, je sais comment comprendre la documentation et savoir quand chaque fichier est chargé ou non. Ce que je me demande, c'est si quelqu'un a tous mis en place des directives complètes sur la manière de décider dans quel fichier mettre un type de personnalisation donné.
Réponses:
TL; DR:
~/.bash_profile
devrait être super-simple et juste charger.profile
et.bashrc
(dans cet ordre)~/.profile
contient des éléments non spécifiquement liés à bash, tels que des variables d'environnement (PATH
et des amis)~/.bashrc
a tout ce que vous voulez sur une ligne de commande interactive. Invite de commande,EDITOR
variable, alias bash pour mon utilisationQuelques autres notes:
Tout ce qui devrait être disponible pour les applications graphiques OU pour sh (ou bash invoqué comme
sh
) DOIT être dans~/.profile
~/.bashrc
ne doit rien sortirTout ce qui ne devrait être disponible que pour les coquilles de connexion devrait aller dans
~/.profile
Assurez-vous que cela
~/.bash_login
n'existe pas.la source
~/.profile
de définir correctement l'environnement pour des services tels que GDM / LightDM / LXDM qui exécutent explicitement / bin / sh..bashrc
sorties beaucoup de choses, pouvez-vous commenter? En particulier, où devrais-je mettre le message d'accueil?[[ $- == *i* ]]
, c'est-à-dire en recherchant 'i' dans la$-
variable spéciale . Bien sûr, cela n’a d’importance que sur les systèmes où bash est compilé pour être lu.bashrc
en mode non interactif. (C'est, Debian mais pas Arch.) Mais il est une cause fréquente de mystérieux messages d'erreur lorsque vous tentez de vous connecter en utilisantsftp
ouscp
ou des outils similaires..bash_profile
et.profile
. Mais bash ne lit que le premier sur trois. Cela signifie que si vous en avez un.bash_login
, les deux.profile
et.bash_profile
seront mystérieusement ignorés.Au cours des dernières années, j'ai eu beaucoup de temps à perdre et j'ai donc effectué des recherches pendant un peu plus de 10 minutes. Je n'ai aucune idée si c'est la meilleure mise en page, c'est juste une qui fonctionne correctement dans à peu près tous les cas.
Les exigences:
~/.profile
doit être compatible avec n’importe quel / bin / sh - cela inclut bash, dash, ksh, tout ce que la distribution pourrait choisir d’utiliser.Les variables d'environnement doivent être placées dans un fichier lu à la fois par les connexions de la console (c'est-à-dire un shell 'login') et par des connexions graphiques (c'est-à-dire des gestionnaires d'affichage tels que GDM, LightDM ou LXDM).
Il y a très peu d'intérêt d'avoir les deux
~/.profile
et~/.bash_profile
. Si ce dernier est manquant, bash l'utilisera avec plaisir, et toutes les lignes spécifiques à Bash peuvent être protégées par un contrôle de$BASH
ou$BASH_VERSION
.La séparation entre
*profile
et*rc
consiste en ce que le premier est utilisé pour les shells de «connexion», et le second à chaque fois que vous ouvrez une fenêtre de terminal. Cependant, bash en mode 'login' ne génère pas~/.bashrc
, il~/.profile
faut donc le faire manuellement.La configuration la plus simple serait:
Avoir un
~/.profile
ensemble qui définit toutes les variables d’environnement (à l’exception de celles spécifiques à bash), affiche éventuellement une ligne ou deux, puis les sources~/.bashrc
s’il est exécuté par bash, en respectant la syntaxe compatible sh.Ayez un programme
~/.bashrc
qui exécute n'importe quelle configuration spécifique au shell, protégé avec une vérification du mode interactif pour éviter de casser des choses commesftp
sur Debian (où bash est compilé avec l'option de chargement~/.bashrc
même pour les shells non interactifs):Cependant, il y a aussi le problème que certaines commandes non interactives (par exemple
ssh <host> ls
) sautent~/.profile
, mais les variables d'environnement leur seraient très utiles.Certaines distributions (par exemple, Debian) compilent leur bash avec l’option de source
~/.bashrc
pour de telles connexions non interactives. Dans ce cas, il m'a été utile de déplacer toutes les variables d'environnement (lesexport ...
lignes) dans un fichier séparé~/.environ
et de le générer à partir des deux.profile
et.bashrc
, avec une protection, pour éviter de le faire deux fois:Malheureusement, pour d'autres distributions (par exemple Arch), je n'ai pas trouvé de très bonne solution. Une possibilité consiste à utiliser le module PAM (activé par défaut) de pam_env, en mettant les éléments suivants dans
~/.pam_environment
:Ensuite, bien sûr, mise
~/.environ
à jour versunset BASH_ENV
.Conclusion? Les coquilles sont une douleur. Les variables d'environnement sont pénibles. Les options de compilation spécifiques à la distribution sont une immense douleur dans le cul.
la source
.profile
et.bashrc
de.bash_profile
et de garder.profile
propre..profile
est propre , merci.~/.profile
et~/.bash_profile
": je suis en désaccord. Voir la réponse de Dan pour savoir pourquoi..profile
et de garder lesbash
parties spécifiques avec des conditionnels.Jetez un coup d'œil à cet excellent article de ShreevatsaR . Voici un extrait, mais consultez l'article du blog, qui inclut une explication de termes tels que "shell de connexion", un organigramme et un tableau similaire pour Zsh.
la source
/etc/profile
appels/etc/bash.bashrc
et les~/.profile
appels~.bashrc
. Tellement efficace,/etc/bash.bashrc
et~/.bashrc
sont également exécutés pour les connexions interactives./bin/sh
BASH_ENV
). Le paragraphe correspondant de la page de manuel bash peut être trouvé en recherchantIf bash is invoked with the name sh
.Je vous propose mes directives "complètes":
.bash_profile
et.profile
charge.bashrc
si elle existe, en utilisant par exemple[ -r $HOME/.bashrc ] && source $HOME/.bashrc
.bashrc
.EDIT: Ajout de citations d'effarouchement à «complet» au cas où quelqu'un serait tenté de le croire. ;)
la source
.bash_profile
et.profile
est un peu redondant; vous avez seulement besoin de ce dernier. Vous devez cependant le rendre / bin / sh-proof,if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi
car il existe des programmes (notamment gdm / lightdm) qui extraient manuellement le fichier à partir d’un script / bin / sh. Cela signifie également que l’environnement conservé.bashrc
serait inefficace. Dû à -1, car vos directives "complètes" ne fonctionneront pas sur beaucoup de systèmes, comme je l'avais découvert à plusieurs reprises.J'ai renoncé à essayer de comprendre celui-ci et
~/.shell-setup
j'ai créé un script ( ) que je tire de tous les autres.Cette approche nécessite
~/.shell-setup
deux fonctionnalités:# 1 est assez standard, bien que peut-être peu utilisé dans les scripts shell.
# 2 est plus compliqué. Voici ce que j'utilise dans bash:
Malheureusement, je ne me souviens pas comment je suis arrivé à cela, ni pourquoi la détection d'un shell interactif n'était pas suffisante.
la source
Tout mettre dans
.bashrc
puis source.bashrc
de.profile
Depuis la page de manuel de bash (sous OS X 10.9):
Le texte ci-dessus est la raison pour laquelle tout est mis en
.bashrc
po Cependant, le comportement d'un shell de connexion est légèrement différent. Encore une fois, citant la page de manuel:.profile
est lu pour les coquilles de connexion, mais.bashrc
n'est pas. La duplication de tout ce que cela contient.bashrc
est mauvaise ™, nous devons donc le rechercher.profile
afin que le comportement reste cohérent.Cependant, vous ne voulez pas la source
.bashrc
de.profile
manière inconditionnelle. Veuillez consulter les commentaires et autres réponses pour plus de détails.la source
.bashrc
de.profile
. Voir la réponse de @ DanRabinowitz.[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc
serait un doux oneliner pour.profile
.