2009-09-30 15:54:44 +0000 2009-09-30 15:54:44 +0000
106
106

¿Qué es el archivo .bashrc?

Los shells Unix al iniciar leen el archivo .bashrc y ejecutan los comandos escritos en él. ¿Qué es este archivo y qué es lo que ejecuta?

Respuestas (3)

69
69
69
2009-09-30 15:57:31 +0000

En realidad, es bash específicamente que dice .bashrc (y /etc/bash.bashrc). Hay muchos shells diferentes.

La página de bash man (de Brian Fox y Chet Ramey; también página de información “Bash Startup Files” ) es la referencia autorizada:

Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, bash lee y ejecuta los comandos de ~/.bashrc, si ese archivo existe. Esto puede ser inhibido usando la opción --norc. La opción --rcfile file obligará a bash a leer y ejecutar comandos desde un archivo en lugar de ~/.bashrc.

Cuando se inicia bash de forma no interactiva, para ejecutar un script de shell, por ejemplo, busca la variable BASH_ENV en el entorno, expande su valor si aparece allí y utiliza el valor expandido como el nombre de un archivo para leer y ejecutar. Bash se comporta como si se ejecutara el siguiente comando:

if [-n "$BASH_ENV"]; then . "$BASH_ENV"; fi

pero el valor de la variable PATH no se utiliza para buscar el nombre del archivo.

El archivo es sólo comandos de shell. Se usa típicamente para cambiar los avisos, establecer las variables de entorno y definir los procedimientos del shell. Tradicionalmente, el archivo .profile se usa para este propósito, pero bash tiene tantas extensiones que necesita su propio archivo de inicio para los usuarios que quieren poner bashismos en los archivos de inicio.

Not a login shell” significa cosas como lanzamientos de scripts y normalmente ventanas de terminal iniciadas por gestores de ventanas. A veces configuro los sistemas *nix para que tengan .bashrc y BASH_ENV sólo la fuente .profile. Siempre y cuando no te desvíes de los comandos de shell de POSIX, entonces obtendrás la misma inicialización en cualquier shell.

Es particularmente valioso cuando sh es realmente bash, lo que a veces sucede. Una razón por la que todo esto es tan complejo es porque a veces la gente pone cosas que producen salida en los archivos de inicio de la shell, o establecen incondicionalmente los comandos. Esto causa muchos problemas cuando se ejecutan programas de shell y comandos de retroceso dentro de los lenguajes, sin mencionar system(3) de los programas de C. La forma en que bash se inicia está diseñada, creo, para tener un archivo donde la salida y la configuración del prompt está bien y un archivo donde no lo está. Tradicionalmente, se hacía una prueba de ejecución para distinguir la interactividad, por ejemplo, comprobando si el prompt está configurado.

12
12
12
2009-09-30 15:56:30 +0000

Cuando Bash se inicia, ejecuta los comandos en una variedad de diferentes scripts.

Cuando Bash es invocado como un shell de inicio de sesión interactivo, primero lee y ejecuta los 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 desde el primero que existe y es legible.

Cuando se inicia un shell de inicio de sesión, Bash lee y ejecuta comandos del archivo ~/.bash_logout, si existe.

Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, Bash lee y ejecuta comandos del ~/.bashrc, si existe ese archivo. Esto puede ser inhibido usando la opción –norc. La opción –rcfile file forzará a Bash a leer y ejecutar comandos desde un archivo en lugar de ~/.bashrc. http://en.wikipedia.org/wiki/Bash_(Unix_shell)

He aquí algunos trucos y consejos: http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html

Intentemos configurar el prompt para que muestre la fecha de hoy y el nombre del host:

PS1="\d \h $ "
10
10
10
2009-09-30 15:56:46 +0000

Debería contener varios comandos de “inicialización” para su shell, por ejemplo:

  • Crear alias útiles (por ejemplo alias ll='ls -l').
  • Añadir más directorios al PATH.
  • Establecer nuevas variables de entorno.