Les gens source bash_profile de bashrc au lieu de l'inverse en raison de la convention locale .
Tous les avis que j'ai lu sur la façon dont on configure ses fichiers de démarrage dans 09
repose principalement sur les conventions locales. La convention locale ne mentionne généralement pas la situation dans son ensemble dans la mesure où elle ne parle pas beaucoup du cas sans connexion et non interactif. Le plus drôle, c'est que j'ai regardé, mais je vois rarement quelqu'un mentionner 12
dans tous leurs discours sur la raison pour laquelle mettre des variables dans un fichier de démarrage par rapport à l'autre. En fait, je n'ai entendu aucun commentaire dire :"/bin/sh est là pour une raison. Bash émule le shell Bourne d'origine, /bin/sh, lorsqu'il est appelé en tant que tel. " D'une part, et je m'égare légèrement, ce cas est important pour les personnes qui travaillent avec le shell non seulement de manière interactive, mais qui fournissent des services non interactifs, sans connexion (sans surveillance ou arrière-plan ) 24
les scripts qui nécessitent un traitement shell minimal, c'est-à-dire que le traitement en arrière-plan ne nécessite pas les subtilités des invites colorées, l'historique et la substitution des commandes, une variable $TERM correctement définie, etc.
En outre et par rapport à 31
, ce que je vois habituellement, ce sont des gens qui créent des chemins de recherche minimaux ou appellent des programmes pleinement qualifiés, et ne savent pas comment gérer la sortie non connectée à un terminal (c'est-à-dire le 41
non interactif et sans connexion ou 58
cas) lorsqu'ils travaillent avec leur 66
scripts. Cela est généralement dû au fait qu'une bonne compréhension de la séquence de démarrage du shell n'est pas entièrement comprise, ce qui conduit un utilisateur à implémenter ses propres fichiers de démarrage d'une manière incohérente ou incohérente avec les conventions déjà établies dans le 71 fichiers de démarrage.
En élaborant, la configuration effectuée par convention locale est définie dans cette installation particulière et le 85
du shell des dossiers. Si l'on examine le 97
d'une installation UNIX fichiers, qui sont invoqués dans le cadre d'un 100
typique séquence de démarrage, il faut alors créer sa propre start-up d'une manière complémentaire à la convention établie dans ces 117
fichiers de démarrage.
Le projet de documentation Linux indique :
/etc/skel/ Les fichiers par défaut pour chaque nouvel utilisateur sont stockés dans ce répertoire. Chaque fois qu'un nouvel utilisateur est ajouté, ces fichiers squelettes sont copiés dans leur répertoire personnel. Un système moyen aurait :des fichiers .alias, .bash_profile, .bashrc et .cshrc. Les autres fichiers sont laissés à l'administrateur système.
Bien que le 120
le manuel ne mentionne pas ces fichiers que l'on trouve couramment dans le 137
répertoire explicitement, d'après ce dont je me souviens, SunOS, Solaris, RedHat, Ubuntu, HP-UX, umips et Ultrix ont 148
fichiers pour modéliser les fichiers de démarrage du shell d'un utilisateur après. OSX ne le fait clairement pas - j'utilise OSX 10.9.1 en ce moment. Malheureusement, OSX ne vous donne pas grand-chose sur la façon dont les choses doivent être configurées en termes de convention, mais comme OSX est un dérivé de BSD, j'ai simplement utilisé un autre dérivé de BSD et modélisé mon propre 153
séquence de démarrage après cela, en l'ajustant pour s'adapter aux conventions locales utilisées dans OSX 10.9.1 161
fichiers de démarrage.
Un point important mentionné dans un commentaire parallèle est que pour OSX, la convention consiste à démarrer chaque nouveau terminal en tant que shell de connexion interactif. C'est en effet la valeur par défaut sous OSX. Il n'y a aucun problème avec cette convention tant que les utilisateurs d'une installation sont cohérents. Le comportement par défaut du terminal sous OSX peut être modifié pour se conformer aux conventions de démarrage du shell d'autres distributions UNIX en apportant la modification suivante aux préférences du terminal , en particulier, modifiez le paramètre, 170
pour émettre le 189
commande :
Avec tout cela comme arrière-plan ou introduction, je vais passer à mes meilleurs conseils , pour ce que ça vaut.
Mon meilleur conseil :
Examinez les fichiers que les administrateurs de votre distribution UNIX ont mis en place. Commencez par les emplacements suivants, s'ils existent. N'oubliez pas d'utiliser le 193
commande, car certains fichiers commencent par un point. Découvrez comment ces fichiers sont utilisés au démarrage et voyez comment vos propres fichiers de démarrage interagissent avec eux :
/etc/bashrc
/etc/profile
/etc/skel/.bash_logout
/etc/skel/.bashrc
/etc/bash.bashrc
/etc/bash_completion
Regardez dans le 202
manuel pour la séquence d'invocation et de démarrage. Tout est très bien présenté.
Avec tout cela comme mise en garde - voici comment j'ai fait les choses sur mon installation OSX 10.9.1 - Les autres distributions UNIX SERONT différentes, mais ce qui est présenté ci-dessous devrait fonctionner sur la plupart sinon toutes les distributions UNIX, mais utilisez ces autres distributions UNIX ' convention comme guide pour adapter ce qui suit à vos propres fins :
.profil
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists. Note, however, that we will have a ~/.bash_profile and it
# will simply source this file as a matter of course.
# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.
# From here on out, I basically set up my PATH, LD_LIBRARY_PATH, and anything else I'd like
# global to running programs and how those programs find their libraries. This is shared by
# `cron`, so we really don't want interactive stuff, here. Also, I setup my environments
# for brew, macports, and fink here, essentially with setting PATH, and invocation of those
# package initialization file as in:
# Brew and locally compiled stuff:
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH
# The following line puts gnu utilities without the prefix "g" in the path
# i.e. tar/gtar:
export PATH=$PATH:/usr/local/Cellar/coreutils/8.21/libexec/gnubin
# MacPorts shoves stuff in /opt, so to get at that stuff...
export PATH=/opt/local/bin:$PATH
export PATH=/opt/local/sbin:$PATH
# Set up for using Fink, which lives in /sw:
[ -e /sw/bin/init.sh ] && . /sw/bin/init.sh
# My stuff:
export PATH=~/perl:$PATH
export PATH=~/bin:$PATH
export PATH=.:$PATH
.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# From here on out, I put in things that are meaningful to interactive shells, like aliases,
# `shopt` invocations, HISTORY control, terminal characteristics, PROMPT, etc.
.bash_profile
# ~/.bash_profile: executed by the command interpreter for login shells.
# Because of this file's existence, neither ~/.bash_login nor ~/.profile
# will be sourced.
# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.
# Because ~/.profile isn't invoked if this files exists,
# we must source ~/.profile to get its settings:
if [ -r ~/.profile ]; then . ~/.profile; fi
# The following sources ~/.bashrc in the interactive login case,
# because .bashrc isn't sourced for interactive login shells:
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
# I'm still trying to wrap my head about what to put here. A suggestion
# would be to put all the `bash` prompt coloring sequence functions as
# described on http://brettterpstra.com/2009/11/17/my-new-favorite-bash-prompt/
C'est donc mon grain de sel. Gardez à l'esprit que mes exemples ont essayé de montrer le chemin de contrôle à travers les fichiers de démarrage et d'éviter ce que les conventions d'un site particulier peuvent imposer.
pourquoi mettons-nous tout dans bash_profile en premier lieu ?
.profile était à l'origine utilisé par /bin/sh, l'utilisation de .profile permet une rétrocompatibilité.
Sauf si vous utilisez mac, tout n'est pas mis dans bash_profile. Il est mis en bashrc
ne serait-il pas plus logique et plus cohérent avec la communauté Linux de tout mettre dans bashrc et d'avoir la source bash_profile ?
Il est courant de mettre des informations système dans le shell qui est chargé lors de la connexion à la machine (uptime, packages à mettre à jour, cpu temp ect...). Si bashrc provenait de bash_profile, vous verriez toutes ces informations chaque fois que vous ouvririez un nouveau shell.
Sous Unix :
.bash_profile est chargé par les shells de connexion
.bashrc est chargé par des shells interactifs
Sauf pour Mac, qui charge le shell de connexion à chaque nouveau terminal (interactif ou non)
Ressources supplémentaires
différence entre bashrc et bash-profile
Où sont spécifiées les variables d'environnement
[...] Je ne comprends pas pourquoi préférer bash_profile est la norme ?
Qui a dit que c'était la norme ? Le manuel Bash lui-même a ceci à dire sur le sujet :
Donc, généralement, votre ~/.bash_profile contient la ligne
si [ -f ~/.bashrc ] ; alors . ~/.bashrc; fi
après (ou avant) toute initialisation spécifique à la connexion.