web-dev-qa-db-fra.com

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

Est ~/.bashrc le seul endroit pour spécifier des variables d'environnement spécifiques à l'utilisateur, des alias, des modifications à la variable PATH, etc.?

Je demande parce qu'il semble que ~/.bashrc semble être bash- uniquement, mais d'autres shells existent aussi…

115
Stefan

Le fichier $HOME/.profile est utilisé par un certain nombre de shells, dont bash, sh, dash et éventuellement d'autres.

Depuis la page de manuel de bash:

Lorsque bash est invoqué comme un 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, et lit et exécute les commandes du premier qui existe et est lisible.

csh et tcsh ne regardent pas explicitement ~/.profile mais ces coquilles sont un peu désuètes.

97
msw

~/.profile est le bon endroit pour les définitions de variables d'environnement et pour les programmes non graphiques que vous souhaitez 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 style Bourne (sh, ksh, bash). Zsh exécute ~/.zprofile à la place, et Csh et tcsh exécutent ~/.login.

Si vous vous connectez sous un gestionnaire d'affichage X (xdm, gdm, kdm, ...), que ~/.profile est exécuté dépend de la façon dont votre gestionnaire d'affichage et peut-être l'environnement de bureau ont été configurés par votre distribution. Si vous vous connectez sous une "session personnalisée", cela exécute généralement ~/.xsession.

~/.bashrc est le bon endroit pour les paramètres spécifiques à bash, tels que les alias, les fonctions, les options Shell et les invites. Comme son nom l'indique, il est spécifique à bash; csh a ~/.cshrc, ksh a ~/.kshrc, et zsh a <drumroll> ~/.zshrc.

Voir également:

Il n'y a pas de fichier commun, mais vous pouvez faire lire chaque Shell à partir d'un fichier commun.

  1. bash lit à partir de .bash_profile ou .bashrc
  2. zsh lit à partir de .zprofile et.zshrc
  3. ksh lit à partir de .profile ou $ENV

Voici donc 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 disposez d'un accès root au système, une autre méthode consiste à configurer pam_env.

Vous pouvez mettre

session optional pam_env.so user_envfile=.env

dans le /etc/pam.d fichier (par exemple /etc/pam.d/common-session sur Debian), puis lorsque l'utilisateur se connecte, PAM lira les variables d'environnement de ~/.env.

Notez que pam_env ne prend en charge que VAR=value entrées.

Plus d'informations:

23
Mikel

Il n'y a rien de tel qu'un fichier de configuration d'environnement pour différents shells, car son même Shell spécifie comment ils sont définis.

Dans csh vous utilisez setenv dans bash vous utilisez export pour les définir.

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

15
echox