¿Por qué no hay shebang en .bashrc / .bash_profile?

22

Consulta simple: me acabo de dar cuenta de que nunca he visto un shebang encima de un .bashrcscript, lo que me lleva a pensar que el sistema usa el shell predeterminado para obtenerlo al iniciar sesión ( ${SHELL}). Estoy reflexionando sobre las razones por las cuales ese es el caso, es decir, se considera un mal hábito usar algo diferente al shell predeterminado para ejecutar el script de inicio de sesión.

anfibio
fuente
1
Hay una razón por la que se llama bash rc ...
Ajedi32

Respuestas:

28

.bashrcy NO.bash_profile son guiones. Son archivos de configuración que se obtienen cada vez que se ejecutan de una de dos maneras:bash

  • interactivo
  • iniciar sesión

La sección de INVOCACIÓN de la página de manual de bash es lo relevante.

Un shell de inicio de sesión es aquel cuyo primer carácter del argumento cero es a -, o uno que comenzó con la --loginopción.

Un shell interactivo es uno que se inicia sin argumentos sin opciones y sin la -copción cuya entrada estándar y error están conectados a los terminales (según lo determinado por isatty(3)), o uno que comenzó con la -i opción. PS1 se configura e $-incluye isi bashes interactivo, lo que permite un script de shell o un archivo de inicio para probar este estado.

Los siguientes párrafos describen cómo bashejecuta sus archivos de inicio. Si alguno de los archivos existe pero no se puede leer, bash informa de un error. Tildes se expanden en los nombres de archivo como se describe a continuación en Expansión de Tilde en la sección EXPANSIÓN .

Cuando se invoca bash como un shell de inicio de sesión interactivo , o como un shell no interactivo con la --loginopción, primero lee y ejecuta comandos del archivo /etc/profile, si ese archivo existe. Después de leer ese archivo, busca ~/.bash_profile, ~/.bash_loginy ~/.profile, en ese orden, y lee y ejecuta órdenes desde el primero que existe y es legible. La --noprofileopción se puede usar cuando se inicia el shell para inhibir este comportamiento.

Cuando sale 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 desde ~/.bashrc, si ese archivo existe. Esto puede inhibirse mediante el uso de la --norcopción. La --rcfile file opción obligará a bash a leer y ejecutar comandos desde el archivo en lugar de ~/.bashrc.

Puede controlar cuándo se cargan a través de los interruptores de línea de comando, --norcy --noprofile. También puede anular la ubicación de donde se cargan usando el --rcfileinterruptor.

Como otros han mencionado, puede imitar cómo se cargan estos archivos mediante el uso del source <file>comando o el uso del . <file>comando.

Es mejor pensar en esta funcionalidad de la siguiente manera:

  1. bash comienza con un entorno desnudo
  2. bash luego abre uno de estos archivos (dependiendo de cómo se invocó como interactivo o inicio de sesión, y luego ...
  3. ... línea por línea ejecuta cada uno de los comandos dentro del archivo ...
  4. cuando se completa da el control en forma de mensaje, esperando la entrada

Métodos para invocar

Este tema parece surgir de vez en cuando, así que aquí hay una pequeña hoja de trucos de las diversas formas de invocar bashy en qué dan lugar. NOTA: Para ayudar, agregué los mensajes "fuente $ HOME / .bashrc" y "fuente $ HOME / .bash_profile "a sus respectivos archivos.

llamadas básicas

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  3. bash -il -o- bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi

    NOTA: ¡ Observe que el -cinterruptor no originó ninguno de los archivos!

deshabilitar la lectura de los archivos de configuración

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i -o- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

Más formas esotéricas de llamar a bash

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

Estos fallaron

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

Probablemente hay más, pero entiendes el punto, con suerte ...

¿Qué más?

Por último, si está tan fascinado con este tema que le gustaría leer / explorar más sobre él, le sugiero que consulte la Guía para principiantes de Bash, específicamente la sección: 1.2. Ventajas del Bourne Again SHell . Las distintas subsecciones bajo esa, "1.2.2.1. Invocación" a través de "1.2.2.3.3. Comportamiento interactivo del shell" explican las diferencias de bajo nivel entre las diversas formas en que puede invocar bash.

slm
fuente
@amphibient: lo siento, se salió un poco de control, es de esperar que la gente aprecie su valor y no lo castigue con votos negativos. Con esto aquí, ahora podemos referenciarlo en otra respuesta en el futuro. 8-). Estaba pensando en hacer una mesa para mostrar esto, pero eso hubiera sido una locura 8-).
slm
¿Realmente has probado estos? Una vez traté de seguir lo que hace mi golpe al apretar y no se comportó como el manual sugería
Bananguin
@Bananguin: cada uno de esos comandos fue ejecutado por mí y esa es la salida que se produjo debajo de los comandos. La única "cosa" potencial con mi configuración podría ser que mi .bash_profileincluya una línea para obtener el .bashrc. Pero creo que eso es muy típico de las configuraciones.
slm
Esto podría ser subjetivo, pero no diría eso .bashrcy .bash_profileno son guiones . En mi humilde opinión, son scripts de propósito específico que se obtienen implícitamente durante la inicialización de bash o explícitamente cuando necesita aplicar sus modificaciones. No solo configuran el entorno bash (variables, funciones, alias ...) como se espera de los archivos de configuración. Pueden realizar cualquier acción como en los scripts comunes. Por ejemplo, pueden iniciar varias acciones como tareas en segundo plano, escribir registros de registro, inicializar algunos programas, etc. ¡De todos modos, gracias por el resumen detallado!
pabouk
¡Esta respuesta es incluso mejor que cualquier respuesta aquí stackoverflow.com/questions/415403/… !
Jacob Tomlinson
13

.bashrclos scripts solo se ejecutan bashsolos. No son independientes, y no están destinados a ser execmodificados por el sistema. (De hecho, generalmente no están marcados como ejecutables y, como usted dice, no tienen una línea shebang).

Dichos scripts están destinados a ser sourced, ya que generalmente hacen cosas como cambiar las variables de entorno ( $PATHpor ejemplo), que se espera que persistan después de que finalice el script. Por lo tanto, sería realmente inútil intentar ejecutar uno en una subshell.

rici
fuente
5

Además de las otras respuestas, tenga en cuenta que si lo desea, nada le prohíbe poner un shebang al comienzo de estos archivos de configuración.

Eso no perjudicaría a Shell, ya que el shebang se procesará como un comentario habitual, es decir, se ignorará.

Eso podría ayudar a los editores que usan el resaltado de sintaxis para descubrir qué lenguaje de programación se usa en el archivo.

Sin vimembargo, tenga en cuenta que algunos editores ofrecen formas alternativas como modelinas para este último. es decir, siempre puedes poner líneas de modo al final del ~/.bashrcy ~/.bash_profileasí:

...
<code in ~/.bashrc>
...
# vim: ft=sh :
jlliagre
fuente
1
La respuesta aceptada de @slm anterior es excelente, pero esto es lo que estaba buscando, con respecto a agregar un shebang al comienzo de mi .bash_profilerecomendación de ShellCheck.
jlucktay
1

Leí esto en cualquier lugar, no sé exactamente dónde, pero es verdad

El manual de Bash es un poco confuso en esta área, pero Bash no ejecuta ~ / .bash_profile como un script de shell. Sí lee el archivo y luego ejecuta los comandos dentro de él (puede hacer algo similar ejecutando source ~ / .bash_profile).

Rahul Patil
fuente