Los ficheros de inicio de Bash

El intérprete de comandos /bin/bash (de aquí en adelante nos referiremos a él como "el intérprete") usa una colección de ficheros de inicio para ayudar a crear un entorno en el que ejecutarse. Cada fichero tiene un uso específico y puede afectar de manera diferente a entornos interactivos y de ingreso. Los ficheros del directorio /etc generalmente proporcionan las configuraciones globales. Si en tu directorio personal existe un fichero equivalente, este puede prevalecer sobre las configuraciones globales.

Un intérprete interactivo de ingreso se ejecuta después de una entrada correcta al sistema, mediante /bin/login, leyendo el fichero /etc/passwd. El intérprete invocado lee normalmente durante el arranque /etc/profile y su equivalente privado, ~/.bash_profile

Un intérprete interactivo de no ingreso se ejecuta mediante la línea de comandos (por ejemplo, [prompt]$/bin/bash) o mediante el comando /bin/su. Un intérprete interactivo de no ingreso puede iniciarse también con un programa de terminal, como xterm o konsole, dentro de un entorno gráfico. Este tipo de invocación del intérprete normalmente copia el entorno padre y luego lee en el fichero ~/.bashrc del usuario las instrucciones de configuración adicionales para el arranque.

Un intérprete no interactivo está presente normalmente cuando se ejecuta un guión. Es no interactivo porque está procesando un guión y no está esperando a que el usuario introduzca un comando. Para estas invocaciones del intérprete sólo se utiliza el entorno heredado del padre.

El fichero ~/.bash_logout no se utiliza para la invocación de un intérprete. Es leido y ejecutado cuando un usuario sale de un intérprete interactivo de ingreso.

A los ficheros estándar le añadimos también /etc/bashrc, que es llamado desde el ~/.bashrc del usuario para establecer los valores del sistema de inicialización de intérpretes de no ingreso.

Para más información, consulta info bash -- Nodos: Bash Startup Files e Interactive Shells (Ficheros de inicio de Bash e Intérpretes Interactivos)

/etc/profile

Aquí se muestra un fichero /etc/profile básico. Este fichero comienza estableciendo ciertas funciones auxiliares y algunos parámetros básicos. Especifica varios parámetros del historial de bash y, por razones de seguridad, desactiva el almacenamiento de un fichero de historial permanente para root. También establece un símbolo del sistema por defecto. Entoces invoca a pequeños guiones de propósito único en el directorio /etc/profile.d para proporcionar una mayor inicialización.

Para más información de las secuencias de escape que puedes usar para el indicador del sistema (p.e la variable de entorno PS1) consulta info bash -- Nodo: Printing a Prompt.

cat > /etc/profile << "EOF"
# Inicio de /etc/profile
# Escrito para Más Allá de Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>
# modificaciones por Dagmar d'Surreal <rivyqntzne@pbzpnfg.arg>

# Variables de entorno del sistema y programas de inicio.

# Alias del sistema y funciones deberían estar en /etc/bashrc. Variables
# de entorno personales y programas de inicio deberían estar en
# ~/.bash_profile. Alias personales y funciones deberían estar en
# ~/.bashrc.

# Función para ayudarnos a manejar rutas. El segundo argumento es
# el nombre de la variable de ruta a modificar (por defecto PATH)
pathremove () {
        local IFS=':'
        local NEWPATH
        local DIR
        local PATHVARIABLE=${2:-PATH}
        for DIR in ${!PATHVARIABLE} ; do
                if [ "$DIR" != "$1" ] ; then
                  NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
                fi
        done
        export $PATHVARIABLE="$NEWPATH"
}

pathprepend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}

pathappend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}

if [ $EUID -eq 0 ] ; then
        unset HISTFILE
fi

# Define algunas variables de entorno.
export HISTSIZE=1000
export HISTIGNORE="&:[bf]g:exit"
#export PS1="[\u@\h \w]\\$ "
export PS1='\u@\h:\w\$ '

for script in /etc/profile.d/*.sh ; do
        if [ -x $script ] ; then
                . $script
        fi
done

# Ahora se límpia a sí mismo
unset pathremove pathprepend pathappend

# Fin de /etc/profile
EOF

Ahora crea el directorio /etc/profile.d.

install --directory --mode=0755 --owner=root --group=root /etc/profile.d

/etc/profile.d/dircolors.sh

Este guión utiliza los ficheros ~/.dircolors y /etc/dircolors para controlar el color de los nombres de ficheros en un listado de directorio. Controla la salida colorizada de cosas como ls --color. La explicación sobre cómo inicializar estos ficheros se encuentra al final de este sección.

cat > /etc/profile.d/dircolors.sh << "EOF"
# Setup for /bin/ls to support color, the alias is in /etc/bashrc.
if [ -f "/etc/dircolors" ] ; then
        eval $(dircolors -b /etc/dircolors)

        if [ -f "$HOME/.dircolors" ] ; then
                eval $(dircolors -b $HOME/.dircolors)
        fi
fi
alias ls='ls --color=auto'
EOF

/etc/profile.d/extrapaths.sh

Este guión añade varias rutas útiles a las variables de entorno PATH y PKG_CONFIG_PATH. Si quieres, puedes descomentar la última sección para añadir un punto al final de tu ruta. Esto te permitirá lanzar ejecutables del directorio actual sin especificar ./, sin embargo quedas avisado de que esto se considera un grave riesgo de seguridad.

cat > /etc/profile.d/extrapaths.sh << "EOF"
if [ -d /usr/local/lib/pkgconfig ] ; then
        pathappend /usr/local/lib/pkgconfig PKG_CONFIG_PATH
fi
if [ -d /usr/local/bin ]; then
        pathprepend /usr/local/bin
fi
if [ -d /usr/local/sbin -a $EUID -eq 0 ]; then
        pathprepend /usr/local/sbin
fi
for directory in $(find /opt/*/lib/pkgconfig -type d); do
        pathappend $directory PKG_CONFIG_PATH
done
for directory in $(find /opt/*/bin -type d); do
        pathappend $directory
done
if [ -d ~/bin ]; then
        pathprepend ~/bin
fi
#if [ $EUID -gt 99 ]; then
#        pathappend .
#fi
EOF

/etc/profile.d/readline.sh

Este guión establece el fichero de configuración inputrc por defecto. Si el usuario no tiene ajustes personales, utiliza el fichero global.

cat > /etc/profile.d/readline.sh << "EOF"
# Setup the INPUTRC environment variable.
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ] ; then
        INPUTRC=/etc/inputrc
fi
export INPUTRC
EOF

/etc/profile.d/tinker-term.sh

Algunas aplicaciones necesitan una configuración específica de TERM para soportar color.

cat > /etc/profile.d/tinker-term.sh << "EOF"
# This will tinker with the value of TERM in order to convince certain apps
# that we can, indeed, display color in their window.

if [ -n "$COLORTERM" ]; then
  export TERM=xterm-color
fi

if [ "$TERM" = "xterm" ]; then
  export TERM=xterm-color
fi
EOF

/etc/profile.d/umask.sh

Establecer el valor de umask es importante para la seguridad. Aquí desactivamos los permisos de escritura para el grupo para los usuarios del sistema y cuando el nombre del usuario y el nombre del grupo no sn el mismo.

cat > /etc/profile.d/umask.sh << "EOF"
# By default we want the umask to get set.
if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then
  umask 002
else
  umask 022
fi
EOF

/etc/profile.d/X.sh

Si X está instalado, actualizamos también las variables PATH y PKG_CONFIG_PATH.

cat > /etc/profile.d/X.sh << "EOF"
if [ -x /usr/X11R6/bin/X ]; then
        pathappend /usr/X11R6/bin
fi
if [ -d /usr/X11R6/lib/pkgconfig ] ; then
        pathappend /usr/X11R6/lib/pkgconfig PKG_CONFIG_PATH
fi
EOF

/etc/profile.d/xterm-titlebars.sh

Este guión muestra un ejemplo de un método diferente para establecer el símbolo del sistema. La variable normal, PS1, se suplementa con PROMPT_COMMAND. Si está establecido, el valor de PROMPT_COMMAND se ejecuta como comando antes de mostrar cada símbolo del sistema primario.

cat > /etc/profile.d/xterm-titlebars.sh << "EOF"
# The substring match ensures this will work for "xterm" and "xterm-xfree86".
if [ "${TERM:0:5}" = "xterm" ]; then
  PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME} : ${PWD}\007"'
  export PROMPT_COMMAND
fi
EOF

Se pueden añadir fácilmente otras inicializaciones a profile añadiendo guiones adicionales en el directorio /etc/profile.d.

/etc/bashrc

Aquí se muestra un fichero /etc/bashrc básico. Los comentarios en el fichero deberían explicar todo lo que necesitas.

cat > /etc/bashrc << "EOF"
# Inicio de /etc/bashrc
# Escrito para Más Allá de Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>

# Alias del sistema y funciones.

# Variables de entorno del sistema y programas de inicio deberían estar en
# /etc/profile. Variables de entorno personales y programas de inicio deberían
# estar en ~/.bash_profile. Alias personales y funciones deberían estar en
# ~/.bashrc.

# Proporciona un comando /bin/ls con colores. Usado junto con el código
# que está en /etc/profile.

alias ls='ls --color=auto'

# Proporciona un indicador de comandos para intérpretes no interactivos, más
# específicamente, intérpretes ejecutados desde el entorno X. [Busca en el
# archivo una discusión titulada "PS1 Environment Variable" si quieres ver un
# muy buen caso de estudio acerca de esto.] [addendum.]

#export PS1="[\u@\h \w]\\$ "
export PS1='\u@\h:\w\$ '

# Fin de /etc/bashrc
EOF

~/.bash_profile

Aquí se muestra un fichero ~/.bash_profile básico. Si quieres que cada nuevo usuario tenga este fichero automáticamente, basta con que cambies la salida del siguiente comando a /etc/skel/.bash_profile y compruebes los permisos tras la ejecución del comando. Entonces puedes copiar /etc/skel/.bash_profile a los directorios personales de los usuarios que ya existan, incluido root, y estableces correctamente el grupo y propietario.

cat > ~/.bash_profile << "EOF"
# Inicio de ~/.bash_profile
# Escrito para Más Allá de Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>
# actualizado por Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Variables de entorno personales y programas de inicio

# Alias personales y funciones deberían estar en ~/.bashrc. Variables de
# entorno del sistema y programas de inicio deberían estar en /etc/profile.
# Alias del sistema y funciones están en /etc/bashrc.

append () {
  # Primero elimina el directorio
  local IFS=':'
  local NEWPATH
  for DIR in $PATH; do
     if [ "$DIR" != "$1" ]; then
       NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
     fi
  done

  # Luego añade el directorio
  export PATH=$NEWPATH:$1
}

if [ -f "$HOME/.bashrc" ] ; then
  source $HOME/.bashrc
fi

if [ -d "$HOME/bin" ] ; then
  append $HOME/bin
fi

unset append

# Fin de ~/.bash_profile
EOF

~/.bashrc

Aquí se muestra un fichero ~/.bashrc básico. Los comentarios e instrucciones anteriores para usar /etc/skel para .bash_profile también son aplicables aquí. Solo los nombres de los ficheros de destino son diferentes.

cat > ~/.bashrc << "EOF"
# Inicio de ~/.bashrc
# Escrito para Más Allá de Linux From Scratch 
# por James Robertson <jameswrobertson@earthlink.net>

# Alias personales y funciones

# Variables de entorno personales y programas de inicio deberían estar en
# ~/.bash_profile.  Variables de entorno del sistema y programas de inicio
# están en /etc/profile.  Alias del sistema y funciones están en 
# /etc/bashrc. 

if [ -f "/etc/bashrc" ] ; then
  source /etc/bashrc
fi

# Fin de ~/.bashrc
EOF

~/.bash_logout

Aquí se muestra un fichero ~/.bash_logout vacío que puede usarse como plantilla. Comprobarás que el fichero ~/.bash_logout no incluye un comando clear. Esto es porque el borrado de la pantalla se indica en el fichero /etc/issue.

cat > ~/.bash_logout << "EOF"
# Inicio de ~/.bash_logout
# Escrito para Más Allá de Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>

# Cosas que hacer cuando se salga del sistema.

# Fin de ~/.bash_logout
EOF

/etc/dircolors

Si quieres utilizar las capacidades de dircolors ejecuta el siguiente comando. Los pasos anteriores para /etc/skel también pueden usarse para facilitar un fichero .dircolors cuando se añade un nuevo usuario. Como antes, basta con cambiar el nombre del fichero de salida en el siguiente comando y asegurar que los permisos, propietario y grupo son los correctos en los ficheros creados y/o copiados.

dircolors -p > /etc/dircolors

Si deseas personalizar los colores utilizados para diferentes tipos de ficheros, puedes editar el fichero /etc/dircolors. Las instrucciones para establecer los colores se encuentran en dicho fichero.

Por último, Ian Macdonald ha escrito una excelente colección de consejos y trucos para mejorar el entorno del intérprete de comandos. Puedes consultarla en http://www.caliban.org/bash/index.shtml