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.

De los ficheros estándar,/etc/bashrc 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 [ -r $script ] ; then
                . $script
        fi
done

# Ahora hacemos limpieza
unset pathremove pathprepend pathappend

# Fin de /etc/profile
EOF

El directorio /etc/profile.d

Ahora crea el directorio /etc/profile.d, en el que pondrán los guiones individuales de inicialización.

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 2>/dev/null); do
        pathappend $directory PKG_CONFIG_PATH
done
for directory in $(find /opt/*/bin -type d 2>/dev/null); 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 works 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

/etc/profile.d/i18n.sh

Este guión muestra cómo establecer ciertas variables de entorno necesarias para el soporte del idioma nativo. Establecer correctamente estas variables te ofrece:

  • La salida de los programas traducida a tu idioma nativo.

  • Una correcta clasificación de caractéres en letras, dígitos y otras clases. Esto es necesario para que Bash acepte correctamente las pulsaciones de teclado en locales diferentes al inglés.

  • La ordenación alfabética correcta para tu país.

  • El tamño de papel correcto

  • El formato correcto para los valores de moneda, fecha y hora.

Sustituye [ll] con el código de dos letras de tu lenguaje (por ejemplo, “es”) y [CC] con el código de dos letras de tu país (por ejemplo, “ES”). También puedes necesitar especificar (y en realidad esta es la forma preferida) tu codificación de caractéres (por ejemplo, “iso8859-15”) después de un punto (con lo que el resultado sería “es_ES.iso8859-15”). Ejecuta el siguiente comando para obtener más información:

man 3 setlocale

La lista de todas las locales soportadas por Glibc puede obtenerse ejecutando el siguiente comando:

locale -a

Una vez estés seguro sobre los ajustes para tu local, crea el fichero /etc/profile.d/i18n.sh:

cat > /etc/profile.d/i18n.sh << "EOF"
# Set up i18n variables
export LC_ALL=[ll]_[CC]
export LANG=[ll]_[CC]
export G_FILENAME_ENCODING=@locale
EOF

La variable LC_ALL establce el mísmo valor para todas las categorías de la locale. Para unmejor control, puede que quieras establecer valores individuales para todas la categorías listads en la salida del comando locale.

La variable G_FILENAME_ENCODING ñe indica a aplcioes como Glib y GTK+ que los nombre de fichero están en la codificación de la localey no en UTF-8 como asumen pordefecto.

Otros valores de inicializacioón

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"
# Begin /etc/bashrc 
# Written for Beyond Linux From Scratch 
# by James Robertson <jameswrobertson@earthlink.net>
# updated by Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Make sure that the terminal is set up properly for each shell

if [ -f /etc/profile.d/tinker-term.sh ]; then
  source /etc/profile.d/tinker-term.sh
fi

if [ -f /etc/profile.d/xterm-titlebars.sh ]; then
  source /etc/profile.d/xterm-titlebars.sh
fi

# System wide aliases and functions.

# System wide environment variables and startup programs should go into
# /etc/profile.  Personal environment variables and startup programs
# should go into ~/.bash_profile.  Personal aliases and functions should
# go into ~/.bashrc

# Provides a colored /bin/ls command.  Used in conjunction with code in
# /etc/profile.

alias ls='ls --color=auto'

# Provides prompt for non-login shells, specifically shells started
# in the X environment. [Review the LFS archive thread titled
# PS1 Environment Variable for a great case study behind this script 
# addendum.]

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

# End /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.