Existe-t-il un fichier équivalent «.bashrc» lu par tous les shells?

105

Le ~/.bashrc seul endroit pour spécifier des variables d'environnement, des alias, des modifications de PATHvariable, etc. spécifiques à l'utilisateur ?

Je demande parce qu'il semble que cela ~/.bashrcsemble être- bashseulement, mais d'autres coquilles existent aussi…

Stefan
la source

Réponses:

94

Le fichier $HOME/.profileest utilisé par un certain nombre d'obus, notamment bash, sh, dash et éventuellement d'autres.

De la page de manuel de bash:

Lorsque bash est appelé en tant que shell de connexion interactif, ... 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.

csh et tcsh ne regardent pas explicitement ~/.profilemais ces coquilles sont un peu dépassées.

msw
la source
7
Zsh par défaut ne lit pas .profile. C'est pourquoi j'ai supprimé ma réponse précédente en déclarant ceci. Zsh ne lit que .profile quand il est appelé par un lien symbolique nommé sh.
fschmitt
10
tcsh est toujours populaire dans certains environnements.
Maciej Piechotka
1
fschmitt: merci pour la correction; fixé. Maciej Piechotka: Je ne doute pas que c'est vrai. Cependant, il est également possible (bien que compliqué) de créer des scripts * rc qui importent d'autres scripts rc particuliers en fonction du shell sous lequel ils s'exécutent.
msw
1
Pour que cette méthode fonctionne, les utilisateurs doivent s'assurer que chaque shell est un shell de connexion. Par exemple, dans Gnome Terminal, accédez à Profil -> Titre et commande, puis activez-le Run command as a login shell. Vous devez également supprimer ~/.bash_profileou rendre le code source ~/.profile.
Mikel
@fschmitt Vous pouvez aussi utiliser votre source $HOME/.profiledepuis votre Zsh .zshrc. J'ai tendance à mettre tous mes objets de shell portables .profileet ensuite je peux les partager dans n'importe quel environnement dans lequel je pourrais basculer.
Benjamin R
56

~/.profileest le bon endroit pour les définitions de variable d'environnement et pour les programmes non graphiques que vous voulez exécuter lorsque vous vous connectez (par exemple ssh-agent, screen -m). Il est exécuté par votre shell de connexion s'il s'agit d'un shell de type Bourne (sh, ksh, bash). Zsh s'exécute à la ~/.zprofileplace, et Csh et tcsh sont exécutés ~/.login.

Si vous vous connectez sous un gestionnaire d'affichage X (xdm, gdm, kdm, ...), ~/.profileson exécution dépend de la configuration de votre gestionnaire d'affichage et peut-être de l'environnement de bureau par votre distribution. Si vous vous connectez sous une «session personnalisée», cela s'exécute généralement ~/.xsession.

~/.bashrcest le bon endroit pour les paramètres spécifiques à bash, tels que les alias, les fonctions, les options du shell et les invites. Comme son nom l'indique, il est spécifique à bash; csh a ~/.cshrc, ksh a ~/.kshrcet zsh a <roulement de tambour> ~/.zshrc.

Voir aussi:
Différence entre .bashrc et .bash_profile
Quels fichiers d'installation doivent être utilisés pour configurer des variables d'environnement avec bash?
Zsh ne frappe pas ~ / .profile

Gilles
la source
N'oubliez pas que zsh contient également des .zloginéléments .zprofilequi suivent .zshrc (mais uniquement pour les shells de connexion). Voir la FAQ ZSH
Geeb le
21

Il n'y a pas de fichier commun, mais vous pouvez faire en sorte que chaque shell lise depuis un fichier commun.

  1. bashlit à partir .bash_profileou.bashrc
  2. zshlit de .zprofile et .zshrc
  3. kshlit à partir .profileou$ENV

Alors voici ce que je fais:

~/.env

# Put environment variables here, e.g.
PATH=$PATH:$HOME/bin

~/.shrc

test -f "$HOME/.env" && . "$HOME/.env"

# Put interactive shell setup here, e.g.
alias ll='ls -l'
PS1='$PWD$ '
set -o emacs

~/.bashrc

test -f ~/.shrc && source ~/.shrc

# Put any bash-specific settings here, e.g.
HISTFILE=~/.bash_history
shopt -s extglob
IGNOREEOF=yes

~/.zshenv

# Put any zsh-specific settings for non-interactive and interactive sessions, e.g.
setopt braceexpand
setopt promptsubst
setopt shwordsplit

~/.zshrc

test -f ~/.shrc && source ~/.shrc

# Put any zsh-specific interactive settings here, e.g.
HISTFILE=~/.zsh_history
setopt ignoreeof

~/.profile

# Interactive sub-shells source .env, unless this is bash or zsh,
# because they already sourced .env in .bashrc or .zshrc.
if test -z "$BASH_VERSION" -a -z "$ZSH_VERSION" || test -n "$BASH_VERSION" -a \( "${BASH##*/}" = "sh" \)
then
    test -f "$HOME"/.env && . "$HOME"/.env
fi

# The name is confusing, but $ENV is ksh's config file for interactive sessions,
# so it's equivalent to .bashrc or .zshrc.
# Putting this here makes running an interactive ksh from any login shell work.
test -f "$HOME"/.shrc && export ENV="$HOME"/.shrc

# Put any login shell specific commands here, e.g.
ssh-add
stty -ixon

~/.bash_profile

source ~/.bashrc
source ~/.profile

~/.zlogin

# zsh sources .zshrc automatically, only need to source .profile
source ~/.profile

~/.zprofile

(empty)

Si vous avez un accès root au système, vous pouvez également le configurer pam_env.

Tu peux mettre

session optional pam_env.so user_envfile=.env

dans le /etc/pam.dfichier approprié (par exemple /etc/pam.d/common-sessionsur Debian), puis lorsque l'utilisateur se connecte, PAMlira les variables d'environnement à partir de ~/.env.

Notez que, pam_envfondamentalement, ne prend en charge que les VAR=valueentrées.

Plus d'informations:

Mikel
la source
14

Il n’existe pas de fichier de configuration d’environnement pour différents shells, car il est même spécifique à leur shell comment ils sont définis.

En csh vous utilisez setenven bash vous utilisez exportpour les définir.

Quoi qu'il en soit, vous pouvez écrire votre propre fichier de configuration et l'inclure sourcedans les fichiers de points de vos shells.

echox
la source