Global bash_profile

20

Sé que existen /etc/profiley /etc/bashrclos archivos de configuración de las variables de entorno globales y tal vez sólo estoy malentendido sus propósitos, pero ...

¿Hay un bash_profilearchivo global ?

Estoy usando Mac OS X

Hubro
fuente

Respuestas:

15

No se llama bash_profile, pero el lugar estándar para la configuración global de bash es /etc/bash.bashrc. Es habitual llamar a esto desde /etc/profilesi el shell es bash. Por ejemplo, en mi /etc/profiletengo:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1=’0
    if [ f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  fi
fi

En términos de uso, /etc/profileproporciona una configuración de todo el sistema para todos los shells compatibles con Bourne (sh, bash, ksh, etc.). Normalmente no hay necesidad de un equivalente /etc/bash_profile, porque la intención del archivo de perfil es controlar el comportamiento de los shells de inicio de sesión. Normalmente, todo lo que quieras hacer allí no será específico de bash. /etc/bash.bashrces específico de bash y se ejecutará tanto para shells de inicio de sesión como de inicio de sesión.

Para complicar aún más las cosas, parece que OS X ni siquiera tiene un /etc/bash.bashrc. Esto probablemente esté relacionado con el hecho de que los terminales en OS X se ejecutan de manera predeterminada como shells de inicio de sesión , por lo que se pierde la distinción:

Una excepción a las pautas de la ventana de terminal es Terminal.app de Mac OS X, que ejecuta un shell de inicio de sesión de forma predeterminada para cada nueva ventana de terminal, llamando a .bash_profile en lugar de .bashrc. Otros emuladores de terminal GUI pueden hacer lo mismo, pero la mayoría tiende a no hacerlo.

No ejecuto OS X, por lo que el alcance de mi conocimiento termina allí.

ire_and_curses
fuente
No lea /etc/bash.bashrcdesde un shell no interactivo. /etc/profilepuede leerse mediante un shell no interactivo. ¿Ve la diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?
Gilles 'SO- deja de ser malvado'
@Gilles - No estoy claro qué punto estás tratando de hacer aquí. Un shell de inicio de sesión no interactivo es algo realmente inusual. Como referencia, el código que cito no es mi propia creación. Es el predeterminado /etc/profileen Ubuntu 12.04. ¿Qué sugeriría en su lugar si uno quisiera uno /etc/profileque se ejecutara solo bajo bash y no otro shell compatible con sh?
ire_and_curses
El sistema de /etc/profilearchivo para mi sistema contiene un comentario en la parte superior que dice: # System-wide .profile for sh(1). ¿Esto significa que profilees shespecífico? ¿De shalguna manera corre antes bash?
@Josh Voigts: shes un subconjunto de bash. /etc/profilese ejecuta para sh, bashy todos los demás shells compatibles con Bourne.
ire_and_curses
@ire_and_curses Parece que el archivo se llama /etc/bashrcen la Mac, no /etc/bash.bashrc. También parece ejecutarse /bin/shtambién.
BrainStorm.exe
4

/etc/profileEs lo global bash_profile. No hay ningún archivo específico para bash, bash solo lee el archivo estándar leído por todos los shell de estilo Bourne. Ahí es donde puede establecer variables de entorno de todo el sistema.

Consulte ¿Hay un archivo equivalente ".bashrc" leído por todos los shells? para obtener una descripción general genérica de los archivos de inicio comunes de bash.

Gilles 'SO- deja de ser malvado'
fuente
0

Configurar Shell interactivo (Bash) globalmente

Esto no se carga /etc/profile, por lo que no /etc/profile.d/se carga nada (a diferencia de los shells de inicio de sesión, vea el final).

El archivo global para esto es / etc / bashrc o /etc/bash.bashrc (dependiendo del -DSYS_BASHRC=indicador establecido en el momento de la compilación):

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

Por lo general, es una buena idea dejar este archivo tal como está (tanto como sea posible) para evitar conflictos. La estrategia que uso es similar a la que usan los shells de inicio de sesión (/ etc / profile).

Mi estrategia es agregar un cargador al archivo anterior:

# Add new directory analog to /etc/profile.d
mkdir /etc/bashrc.d

# Write the loader to /etc/bash.bashrc (it might be /etc/bashrc on as mentioned above)
cat >> /etc/bash.bashrc << 'EOF'
# I appended this: Load scripts from /etc/bashrc.d
if test -d /etc/bashrc.d; then
  for script in /etc/bashrc.d/*.sh; do
    test -r "$script" && . "$script"
  done
  unset item
fi
EOF

Ahora puedo agregar fácilmente n personalizaciones al archivo de shell global interactivo (bash) colocando nuevos archivos .sh en el directorio /etc/bashrc.d.

Colorear Grep a nivel mundial

/etc/bashrc.d/grep.sh

alias grep='grep --color=auto'

Puedes hacer esto con esta frase:

printf "alias grep=\'grep --color=auto\'" > /etc/bashrc.d/grep.sh

Comparar profile.d versus bashrc.d

Si, después de leer esto, no te convence, hazlo para convencerte:

printf "alias grep=\'grep --color=auto\'" > /etc/profile.d/grep.sh

Abra un nuevo emulador de terminal y busque alguna palabra común en su directorio de usuario como "the" usando grep

grep -r 'the'

Nada debe ser coloreado. Haga lo mismo en una consola virtual haciendo CTRLALTF1 (recuerde que su servidor X probablemente se esté ejecutando en CTRLALTF7 para que pueda volver a cambiar. Si lo olvida, simplemente reinicie su administrador de escritorio, por ejemplo)

grep -r 'the' 

producirá resultados coloreados como se desee.

Nada debe ser coloreado. Haga lo mismo en una consola virtual haciendo CTRLALTF1(recuerde que su servidor X probablemente se esté ejecutando CTRLALTF7para que pueda volver a cambiar. Si lo olvida, simplemente reinicie su administrador de escritorio, por ejemplo)

grep -r 'the' 

producirá resultados coloreados como se desee.

Un shell de inicio de sesión es lo que obtiene cuando inicia una máquina o cambia consolas virtuales a CTRLALTF1través de FNthla consola virtual.

Se carga un Shell de inicio de sesión /etc/profilemientras se cargan los /etc/profile.d/*.sharchivos.

Jonathan Komar
fuente