¿Por qué .bashrc no se ejecuta automáticamente?

202

Pongo algunos comandos de alias en mi .bashrcarchivo, para que puedan cargarse cada vez que abro una nueva ventana de Terminal. Sin embargo, esto no sucede.

Tengo que seleccionar run script:en la Terminal> Preferencias> " MyDefaultTheme "> Shell prefpane y agregar: source .bashrc && clearpara que funcione ...

Esto parece extraño ya que muchos tutoriales solo dicen que solo tiene que agregar al .bashrcarchivo y todo está bien.

Tenga en cuenta que no ejecuto bashcuando uso el terminal, me gusta el otro (predeterminado) (no sé qué es) mejor, porque me muestra dónde estoy todo el tiempo, por ejemplo:

>>d54c6b47b:~ romeo$

en vez de:

>>bash$

En bash todo se carga como debería ser.

Entonces mi pregunta es, ¿por qué mi .bashrcarchivo no se cargó automáticamente y tuve que agregar la opción para llamarlo cada vez?

También un tutorial me dijo que hiciera algo como:

$alias la=’ls -la >> ~/.bashrc

que debería escribir el alias a mi .bashrc, esto tampoco funciona ...

Tenga en cuenta que soy un novato de UNIX, así que sea gentil.

romeovs
fuente
Creo que esto está muy cerca de apple.stackexchange.com/questions/7984/… .
boehj
@boehj bueno, menciona "no cargar .bashrc" pero eso es todo.
Jari Keinänen
OK, perdón si confundí las cosas aquí.
boehj
Probablemente te guste csh(u otra variante) mejor. Pero debes saber que >>bash$se puede cambiar :)
vol7ron
Si desea que los comandos se ejecuten al cargar , cree .profileen su directorio personal
Kolob Canyon

Respuestas:

94

Simplemente colóquelo en su .profilearchivo desde su directorio de inicio y debería funcionar la próxima vez que inicie un nuevo shell o después de ejecutarsource ~/.profile

Este enlace establece claramente el orden en que el shell lee y carga los archivos de inicio: http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup

Cosu
fuente
aceptó este porque tiene una solución (y fue el primero de dos mensajes casi idénticos).
romeovs
37
Votado abajo. Recomiendo no seguir este consejo. El problema es que Terminal crea shells de inicio de sesión, y los shells de inicio de sesión de Bash solo ejecutan el script de inicio de sesión, no ~/.bashrc. Sin embargo, la solución no es simplemente colocar su .bashrccontenido en el archivo de inicio de sesión, porque estos dos archivos están destinados a realizar diferentes tipos de configuración. En cambio, la configuración canónica para Bash es tener su ~/.bash_profilefuente ~/.bashrcen algún punto apropiado del script (generalmente el último).
Chris Page
No veo otra publicación idéntica que solo diga poner en el archivo sh
Mark
218

He estado allí, hecho eso. De lo que me di cuenta, OS X no lee el .bashrcarchivo al inicio de bash. En su lugar, lee los siguientes archivos (en el siguiente orden):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

Vea también el comentario informativo y útil de Chris Johnsen :

Por defecto, Terminal inicia el shell vía /usr/bin/login, lo que hace que el shell sea un shell de inicio de sesión. En cada plataforma (no sólo Mac OS X) fiesta no utiliza .bashrcpara shells de entrada (única /etc/profiley la primera de .bash_profile, .bash_login, .profileque existe y es legible). Es por eso que "poner source ~/.bashrcen su .bash_profile" es un consejo estándar

Yo por lo general sólo hay que poner las cosas que normalmente pondría en ~/.bashrca ~/.profile- ha funcionado hasta ahora como un encanto.

Jari Keinänen
fuente
38
Por defecto, Terminal inicia el shell vía /usr/bin/login, lo que hace que el shell sea un shell de inicio de sesión. En cada plataforma (no sólo Mac OS X) fiesta no utiliza .bashrcpara shells de entrada (única /etc/profiley la primera de .bash_profile, .bash_login, .profileque existe y es legible). Es por eso que "poner source ~/.bashrcen su .bash_profile" es un consejo estándar.
Chris Johnsen el
55
Re "Usualmente pongo las cosas que normalmente ponía en ~ / .bashrc en ~ / .profile": Para una compatibilidad máxima, te recomiendo que sigas los consejos de Chris Johnsen y coloques todo lo que quieras aplicar a los shells que no son de inicio de sesión en ~ / .bashrc y agregue "source ~ / .bashrc" a su ~ / .bash_profile para ejecutarlo para shells de inicio de sesión. De lo contrario, no funcionará para subcapas, o si Terminal cambia para crear shells que no son de inicio de sesión, o si alguna vez usa xterm u otro programa de terminal que crea shells sin inicio de sesión de manera predeterminada, o si desea usar el misma configuración en otro sistema operativo.
Chris Page
44
En una nota relacionada, en Mac OS X debería considerar tener ~ / .bashrc run / etc / bashrc para recoger comportamientos globales. En particular, hay un código en / etc / bashrc para actualizar el directorio de trabajo en cada solicitud, que es lo que permite que Terminal muestre el icono de proxy, cree nuevos terminales en el mismo directorio y restaure el directorio de trabajo para Reanudar y Grupos de ventanas.
Chris Page
Para mí, el abastecimiento de .bashrc de .bash_profile no funcionó. Pero el abastecimiento de .bashrc / .bash_profile de .profile funcionó.
Ken Russell el
2
Buena respuesta pero un poco mal informada. Creo que las cargas terminales fiesta solamente uno de los ~/.bash_profile, ~/.profile, ~/.bash_login, no todos los ellos. Puede ejecutar una prueba simple creando los 3 archivos. Parece que el terminal de fiesta tiene la preferencia de los ~/.bash_profile> ~/.bash_login> ~/.profile. Si alguno de ellos existe, se omiten los de menor preferencia. Por eso a veces se recomienda también la fuente ~/.profilede ~/.bash_profile.
neurita
25

Puse todo en ~/.bashrcy solo source ~/.bashrcen .profile.

Esto permite que las sesiones de pantalla y xterm (y supongo que tmux) hereden mi entorno ya que las sesiones sin inicio de sesión solo se ejecutan .bashrc, mientras que las sesiones de inicio de sesión (por ejemplo, terminal o iTerm) solo se ejecutan .profile.

anu
fuente
1
Este es mi enfoque. De esta manera puedo mantener un .bashrc que funciona en ambos sistemas ... y puedo poner cualquier material específico de Mac o cosas como alias que son solo para el trabajo (donde uso más el Mac) en mi archivo .bash_profile.
Michael Durrant
2
Tenga en cuenta que .profilees común a varios shells y solo debe contener un código sh compatible con POSIX. Si lo fuente .bashrc, posiblemente contenga código específico de Bash (la existencia del .bashrcarchivo es específica de Bash). Recomiendo cambiarle el nombre .profilea .bash_profileya que lo está utilizando de una manera específica de Bash. O, ingrese un código genérico .profiley cree un código .bash_profilefuente .profiley .bashrc.
Chris Page
19

Hay dos escenarios:

  1. Estás usando Linux
  2. Estás usando Mac Os X

Para ambos, desea obtener ~/.bashrcen su perfil que se carga o obtiene cuando se inicia el shell de su terminal.


LINUX

En Linux, ~/.profilese fuente automáticamente en su shell cuando se inicia. Entonces, si va a su terminal y escribe cd ~; ls -A, verá todos sus archivos y directorios en su directorio de inicio ( /home/usrname/). Deberías ver un archivo llamado .profile. Este es el archivo que se "origina" automáticamente cuando inicia el terminal.

Si desea agregar alias y funciones a ~/.bashrc(que es lo que hago), entonces debe (dentro de ~/.profileagregar una instrucción if que verifique si ~/.bashrces un archivo no vacío y luego lo fuente.

Para verificar si ~/.profileya lo hace, ingrese nano ~/.profile. Esto lo abrirá en un editor de texto (puede usar gedit si sabe que lo tiene o incluso vim si sabe cómo usarlo). Puede obtener un archivo de texto vacío (no debería), pero si lo hace, simplemente continúe. Si no ve una línea en ninguna parte que diga source ~/.bashrc, ingrese las siguientes líneas en algún lugar (colóquelo en un lugar razonable como al final o al principio y no en el medio de una instrucción if):

if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

Esto comprueba si ~/.bashrces un archivo no vacío (con if [ -s ~/.bashrc ]), y si es así, lo obtiene. Bastante simple. Ahora, puede agregar cualquier alias válido, función, variable, etc. a ~/.bashrc.


MAC OS X

Por defecto, las fuentes Max OS X ~/.bash_profile. Para poder agregar cosas a ~/.bashrc(que es, de nuevo, lo que hago también en OS X), entonces sigue el mismo procedimiento que Linux. En la terminal ingrese cd ~; nano .bash_profile. Verifique si hay una línea que diga source ~/.bashrcy si no está allí agregue la instrucción if anterior ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi).


NOTAS

Al escribir una declaración if, asegúrese de dejar espacios entre básicamente todo (por ejemplo if [ -s ~/.bashrc]; then echo "found"; fi, no funciona porque no hay espacio entre ellos ~/.bashrcy ]el intérprete pensará que esta es una palabra).

Si desea descubrir cómo verificar mejor las cosas en una declaración if, vaya a la terminal e ingrese man \[; esto esencialmente le da el desglose de una declaración if. Por ejemplo, if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; ficomprueba si /path/to/filees un archivo y si se imprime en stdout en consecuencia. Siempre hago referencia a esto también para una referencia más fácil a los ojos y rápida: 7.2. Operadores de prueba de archivos .

Espero que esto ayude. Recuerdo lo confundido que estaba cuando comencé todo esto (que no fue hace mucho tiempo); así que, ¡buena suerte con tus futuros esfuerzos de UNIX!

Dylan
fuente
En Linux, .profilesolo se obtiene si su shell es un shell de inicio de sesión, de lo contrario .bashrcse obtiene
smac89
11

Sourcing .profile en .bash_profile lo hizo por mí

echo 'source ~/.profile' >> ~/.bash_profile
Luis S
fuente
1
Obtener .profile en .bash_profile es una gran cosa que hacer, pero eso solo no haría que .bashrc se ejecute mediante shells de inicio de sesión. Su .profile ya debe haber originado .bashrc, lo que podría causar problemas si alguna vez utiliza un shell que no sea bash. La mayoría de los usuarios de Mac nunca lo harán, pero si lo haces por alguna razón, recuerda esto. :)
Terry N
Para ampliar lo que @TerryN dijo: asegúrese de obtener .bashrcsu fuente .bash_profiley no la suya .profile. .bash_profilees específico de Bash y debería generar los otros dos.
Chris Page
6

Descubrí que después de instalar rvm (autoinstalador, sin modificaciones manuales) había creado un ~/.bash_loginarchivo para sí mismo, donde anteriormente nunca tuve uno.

Sin embargo, esto significa que mis ~/.profileconfiguraciones y alias ya no se cargaron. Muchos atajos desaparecieron. Pensé que corrían secuencialmente, no exclusivamente: - /

yo añadí

. ~/.profile 

para ~/.bash_loginencadenar las cosas como esperaba.

dman
fuente
+1, esta es la situación que tuve. Descubrí que .bash_login o .bash_profile evitarán que se ejecute .profile ... No tengo idea de por qué bash siente la necesidad de tener tantos archivos de inicio en conflicto.
RichVel
.profilees común a varios shells diferentes y solo debe contener código sh compatible con POSIX. .bash_profilees específico de Bash y puede contener código específico de Bash. En general, si está usando Bash, debería preferir a .bash_profilemenos que tenga cuidado de asegurarse de que su código de inicio no contenga nada que dependa de Bash. Cualquier programa creado .bash_loginprobablemente lo hizo porque contiene código específico de Bash, pero debería haber incluido el código fuente .profilesi existe.
Chris Page
3

Poniendo...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... en ~/.bashrc, y luego la fuente ~/.bashrcen mi ~/.bash_profile no funcionó para el programa Terminal que viene instalado.

Pero luego fui al menú desplegable Editar> Preferencias de perfil , Título y pestaña Comando , y seleccioné Ejecutar comando como un shell de inicio de sesión en la sección de comandos de esa página.

Después de hacerlo, iniciar un nuevo terminal muestra el resultado deseado cuando escribo

 type rvm|head -1

es decir, "rvm es una función". Que no lo hizo hasta que hice este cambio, y es el único cambio que hice después de las .bash_profiley .bashrclos cambios que se describen en otras respuestas aquí.

LiquidMark
fuente
2

En primer lugar, permítame decirle que ese ~/.bashrces el archivo que se ejecuta cada vez que se llama a un segundo shell (cuando se ejecuta un script de shell, por ejemplo), y ~/.profilese llama en cada inicio de sesión.

Por lo tanto, le recomiendo que escriba el . ~/.bashrccomando en su ~/.profilearchivo, y este comando ejecutará el archivo bashrc cada vez que inicie sesión.

arun rana
fuente
cuando se ejecuta .profile al iniciar sesión, ejecuta automáticamente el archivo .bashrc.
arun rana
por lo .bashrc es ejecutado indirectamente en cada inicio de sesión
rana Arun
1
bashrc es para shells sin inicio de sesión. bash_profile / bash_login / profile / lo que sea para los shells de inicio de sesión. Esta es una fuente de una gran cantidad de contención, que implica lo que es y no es un shell de inicio de sesión (una sesión de pantalla / tmux, por ejemplo, un terminal dentro de un entorno de escritorio, etc.). No es necesariamente el "segundo caparazón". Es una cuestión de entrada de shell.
Jason Salaz
3
Si alguna vez usa un shell que no sea Bash, hacer lo que describe puede causarle problemas. .profile se aplica a todos los shells y .bashrc puede contener un lenguaje que otros shells no entienden. En lugar de .profile, ponga lo que escribió en .bash_profile. (Además, haga que lo primero que haga .bash_profile sea "source .profile".)
Terry N
1

Me encontré con el mismo problema después de instalar rbenv en mi servidor remoto (Digital Ocean) Ubuntu 16.04.

De alguna manera se creó ~/.bash_profile. Es lo mismo ~/.bashrcen un sistema OS X.

Y Ubuntu comenzó a leer solo ~/.bash_profile, pero no ~/.bashrccomo debería.

Así que solo hice una copia de seguridad de mis datos ~/.bash_profilecon esto:

mv ~/.bash_profile ~/.bash_profile.bak

Y renombró el viejo ~/.bashrca~/.bash_profile

mv ~/.bashrc ~/.bash_profile

Funcionó para mi. Después de mi inicio de sesión ssh tengo todo cargado ~/.bashrc.

zhisme
fuente
0

En caso de que esto pueda ayudar a alguien más ...

Asegúrese de editar el .bashrcarchivo correcto para el usuario correcto. Tuve un problema similar al usar Vagrant. Después de ejecutar vagrant sshmi .bashrcarchivo no se estaba ejecutando. La solución fue simple porque pensé que vagabundo estaba iniciando sesión con el usuario llamado vagabundo, y en realidad estaba iniciando sesión como otro usuario. Entonces estaba editando el .bashrcarchivo incorrecto . Después de editar el .bashrcarchivo correcto, se reconocieron mis alias.

Allen
fuente
-1

Por cierto, si has activado ZSH, ¡reemplaza bash!

Entonces, todos esos ~/.bashrcarchivos no se cargan.

En su ~/.zshrclugar, debe establecer sus alias .

Frédéric Adda
fuente
-2

Para seguir con el inicio de sesión de estilo OSX .profiley admitir el comportamiento bash normal .bashrc, puede usar un .bashrcarchivo si cambia entre nix normal y OSX proporcionando un enlace simbólico a su .bashrcarchivo llamado .bash_profile. Solo asegúrate de que este archivo no exista antes de intentarlo, pero así es como lo hago.

ln -s .bashrc .bash_profile
Inkspeck
fuente
Al hacer esta vinculación entre 2 secuencias de comandos de inicialización de shell diferentes, está perdiendo una separación de funciones necesaria. Un día u otro necesitará una inicialización en el nivel de sesión ( .bash_profile) y una inicialización diferente en cada nivel de shell ( .bashrc).
dan
-2

/ etc / bashrc es para perfiles globales en sistemas mac. Puede agregar: alias ls = "ls -G" en la parte superior de este archivo y, bueno, todos tendrán archivos y carpetas coloreados en el sistema, por lo que no tendrá que configurar nada adicional para cada usuario individual. También notará, junto con "sudo su -" para rootear de usted mismo, todavía tendrá archivos y carpetas coloreados sin dolores de cabeza adicionales.

Otro consejo divertido: al usar el Iterm2 de mac, la importación de perfiles de color generará el color de los archivos y carpetas inmediatamente de acuerdo con su esquema de color después de tener esta opción "/ etc / bashrc" establecida.

Sulayman Touray
fuente