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)
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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.