¿Hay un archivo equivalente ".bashrc" leído por todos los shells?

105

¿Es ~/.bashrc el único lugar para especificar variables de entorno específicas del usuario, alias, modificaciones a la PATHvariable, etc.?

Pregunto porque parece que ~/.bashrcparece ser solo bash, pero también existen otros proyectiles ...

Stefan
fuente

Respuestas:

94

El archivo $HOME/.profilees utilizado por varios shells, incluidos bash, sh, dash y posiblemente otros.

Desde la página de manual de bash:

Cuando se invoca bash como un shell de inicio de sesión interactivo, ... primero lee y ejecuta comandos del archivo / etc / profile, si ese archivo existe. Después de leer ese archivo, busca ~ / .bash_profile, ~ / .bash_login y ~ / .profile, en ese orden, y lee y ejecuta comandos del primero que existe y es legible.

csh y tcsh explícitamente no miran, ~/.profilepero esos shells son un poco anticuados.

msw
fuente
77
Zsh por defecto no lee .profile. Es por eso que eliminé mi respuesta anterior indicando esto. Zsh solo lee .profile cuando es invocado por un enlace simbólico llamado sh.
fschmitt
10
tcsh sigue siendo popular en algunos entornos.
Maciej Piechotka 13/10/10
1
fschmitt: gracias por la corrección; fijo. Maciej Piechotka: No tengo dudas de que es cierto; sin embargo, también es posible (aunque complicado) crear scripts * rc que importen otros scripts rc particulares en función del shell en el que se ejecutan.
msw
1
Para que esta forma funcione, los usuarios deben asegurarse de que cada shell sea un shell de inicio de sesión. Por ejemplo, en Gnome Terminal, vaya a Perfil -> Título y comando, y habilite Run command as a login shell. También debe eliminarlo ~/.bash_profileo hacerlo fuente ~/.profile.
Mikel
@fschmitt También puede obtener fuentes $HOME/.profiledesde el interior de su Zsh .zshrc. Tiendo a colocar todas mis cosas de shell portátiles .profiley luego puedo compartirlas en cualquier entorno en el que me encuentre.
Benjamin R
56

~/.profilees el lugar adecuado para las definiciones de variables de entorno y para los programas no gráficos que desea ejecutar cuando inicia sesión (por ejemplo ssh-agent, screen -m). Su shell de inicio de sesión lo ejecuta si es un shell de estilo Bourne (sh, ksh, bash). Zsh se ejecuta en su ~/.zprofilelugar, y Csh y tcsh se ejecutan ~/.login.

Si inicia sesión con un administrador de pantalla X (xdm, gdm, kdm, ...), si ~/.profilese ejecuta depende de cómo su distribución configuró su administrador de pantalla y quizás el entorno de escritorio. Si inicia sesión en una "sesión personalizada", normalmente se ejecuta ~/.xsession.

~/.bashrces el lugar adecuado para configuraciones específicas de bash, como alias, funciones, opciones de shell y mensajes. Como su nombre indica, es específico de bash; csh tiene ~/.cshrc, ksh tiene ~/.kshrcy zsh tiene <drumroll> ~/.zshrc.

Consulte también:
Diferencia entre .bashrc y .bash_profile
¿Qué archivos de configuración deben usarse para configurar variables de entorno con bash?
Zsh no golpea ~ / .profile

Gilles
fuente
No olvide que zsh también tiene, .zloginademás de .zprofileque se ejecuta después .zshrc (pero solo para shells de inicio de sesión). Vea las preguntas frecuentes de ZSH
Geeb el
21

No hay un archivo común, pero puede hacer que cada shell se lea desde un archivo común.

  1. bashlee de .bash_profileo.bashrc
  2. zshlee de .zprofile y .zshrc
  3. kshlee de .profileo$ENV

Entonces esto es lo que hago:

~/.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 tiene acceso de root al sistema, otra forma es configurarlo pam_env.

Puedes poner

session optional pam_env.so user_envfile=.env

en el /etc/pam.darchivo correspondiente (por ejemplo, /etc/pam.d/common-sessionen Debian), y luego cuando el usuario inicie sesión, PAMleerá las variables de entorno ~/.env.

Tenga en cuenta que pam_envbásicamente solo admite VAR=valueentradas.

Más información:

Mikel
fuente
14

No existe tal cosa como un archivo de configuración de entorno para diferentes shells, porque incluso es específico de la shell cómo se definen.

En csh usas setenven bash exportpara definirlos.

De todos modos, podría escribir su propio archivo de configuración e incluirlo sourceen los archivos de puntos de sus shells.

echox
fuente