C’est embarrassant, mais après de nombreuses années d’utilisation des systèmes POSIX à plein temps, j’ai encore du mal à déterminer si une personnalisation de shell doit être insérée dans .bashrc
, .profile
ou ailleurs. Sans oublier 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é.
TL; DR:
~/.bash_profile
devrait être super simple et il suffit de 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 amis)
~/.bashrc
contient tout ce que vous souhaitez sur une ligne de commande interactive. Invite de commande, variable EDITOR
, alias bash pour mon utilisation
Quelques autres notes:
Tout ce qui devrait être disponible pour les applications graphiques OR to sh (ou bash invoqué en tant que sh
) DOIT être dans ~/.profile
~/.bashrc
ne doit rien sortir
Tout ce qui ne devrait être disponible que pour les shells de connexion devrait aller dans ~/.profile
Assurez-vous que ~/.bash_login
n'existe pas.
Au cours des dernières années, j'ai eu beaucoup de temps à perdre, alors je ai fait des recherches à ce sujet 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 tout/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 (par exemple, des gestionnaires d'affichage tels que GDM, LightDM ou LXDM).
Il y a très peu d'intérêt à avoir les deux ~/.profile
et ~/.bash_profile
. Si ce dernier est manquant, bash se fera un plaisir de l'utiliser, et toutes les lignes spécifiques à Bash peuvent être gardées avec un contrôle pour $BASH
ou $BASH_VERSION
.
La séparation entre *profile
et *rc
est que le premier est utilisé pour les shells de «connexion» et le dernier à chaque fois que vous ouvrez une fenêtre de terminal. Cependant, bash en mode 'login' ne source pas ~/.bashrc
, donc ~/.profile
doit le faire manuellement.
Le plus simple configuration serait:
Avoir un ~/.profile
qui définit toutes les variables d’environnement (à l’exception de celles spécifiques à bash), imprime éventuellement une ligne ou deux, puis le code source ~/.bashrc
s’il est exécuté par bash, en respectant la syntaxe sh-compatible sinon.
exportation TZ = "Europe/Paris" exportation EDITOR = "vim" if ["$ BASH"]; puis . ~/.bashrc fi temps de disponibilité
Avoir un ~/.bashrc
qui effectue toute configuration spécifique à Shell, protégé avec une vérification de mode interactif pour éviter de casser des choses comme sftp
sur Debian (où bash est compilé avec l'option de charger ~/.bashrc
même pour les shells non interactifs) :
[[$ - == * i *]] || renvoie 0 PS1 = '\ h\w\$' start () {Service Sudo "$ 1" start; }
Toutefois, il existe également un problème, à savoir que certaines commandes non interactives (par exemple, ssh <Host> ls
) ignorent ~/.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 ces connexions non interactives. Dans ce cas, il m'a été utile de déplacer toutes les variables d'environnement (les lignes export ...
) dans un fichier séparé, ~/.environ
, et de le source à partir de both .profile
et .bashrc
, avec un garde pour éviter de le faire. deux fois:
si ! ["$ PREFIX"]; puis # ou $ EDITOR, ou $ TZ, ou ... . ~/.environ # généralement toute variable définie par .environ elle-même Fi
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) pam_env en mettant les éléments suivants dans ~/.pam_environment
:
BASH_ENV =. /. Environ # pas une faute de frappe; cela doit être un chemin, mais ~ ne fonctionnera pas
Ensuite, bien sûr, mettre à jour ~/.environ
à unset BASH_ENV
.
Conclusion? Les coquilles sont une douleur. Les variables d'environnement sont pénibles. Les options de compilation spécifiques à la distribution sont un immense douleur dans le cul.
Jetez un coup d'œil à cet excellent article de ShreevatsaR sur le blog . Voici un extrait, mais consultez l'article du blog, qui inclut une explication pour des termes tels que "login Shell", un organigramme et un tableau similaire pour Zsh.
Pour Bash, ils fonctionnent comme suit. Lisez la colonne appropriée. Exécute A, puis B, puis C, etc. B1, B2, B3 signifie qu’il n’exécute que le premier des fichiers trouvés.
+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/profile | A | | |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc| | A | |
+----------------+-----------+-----------+------+
|~/.bashrc | | B | |
+----------------+-----------+-----------+------+
|~/.bash_profile | B1 | | |
+----------------+-----------+-----------+------+
|~/.bash_login | B2 | | |
+----------------+-----------+-----------+------+
|~/.profile | B3 | | |
+----------------+-----------+-----------+------+
|BASH_ENV | | | A |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.bash_logout | C | | |
+----------------+-----------+-----------+------+
Je vous propose mes directives "complètes":
.bash_profile
et .profile
charge .bashrc
s'il 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. ;)
J'ai renoncé à essayer de comprendre celui-ci et j'ai créé un script (~/.Shell-setup
) que je tire de tous les autres.
Cette approche nécessite que ~/.Shell-setup
ait deux fonctionnalités:
# 1 est assez standard, bien que peut-être pas beaucoup utilisé dans les scripts Shell.
# 2 est plus compliqué. Voici ce que j'utilise dans bash:
if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
echo "Hello user!" # ... etc
fi
Malheureusement, je ne me souviens pas comment je suis arrivé à cela, ni pourquoi détecter un Shell interactif ne suffisait pas.