Bash lanzamiento en detalle

Si encontró esta página en una búsqueda, entonces probablemente esté tratando de resolver algún problema con la ejecución de bash.

Es posible que su bash de entorno no establezca una variable de entorno y no entienda por qué. Es posible que haya insertado algo en los diversos archivos de arranque de bash o en los perfiles, o en todos los archivos al azar hasta que funcionó.

En cualquier caso, el objetivo de esta nota es describir el procedimiento de inicio de bash lo más fácil posible para que pueda resolver los problemas.

Chart


Este diagrama de flujo resume todos los procesos cuando se ejecuta bash.



Ahora echemos un vistazo más de cerca a cada parte.

¿Shell de inicio de sesión?


Primero debe elegir si está en el shell de inicio de sesión o no.

El shell de inicio de sesión es el primer shell que ingresa cuando inicia sesión para una sesión interactiva. El shell de inicio de sesión no requiere un nombre de usuario y contraseña. Puede forzar el inicio del shell de inicio de sesión agregando el indicador --login al llamar a bash , por ejemplo:

  bash --login 

El shell de inicio de sesión configura el entorno base cuando ejecuta el shell bash por primera vez.

Interactivo?


Luego determina si el shell es interactivo o no.

Esto puede verificarse mediante la presencia de la variable PS1 (establece la función de entrada del comando):

  si ["$ {PS1-}"];  entonces
   echo interactivo
 otra cosa
   echo no interactivo
 fi 

O vea si la opción -i se establece usando una variable de guión especial en bash, por ejemplo:

  $ echo $ - 

Si hay una i en la salida, entonces el shell es interactivo.

En el shell de inicio de sesión?


Si está en el shell de inicio de sesión, bash busca el /etc/profile y lo ejecuta si existe.

Luego busca cualquiera de estos tres archivos en el siguiente orden:

  ~ / .bash_profile
 ~ / .bash_login
 ~ / .profile 

Cuando encuentra uno, lo lanza y se salta los otros.

En un shell interactivo?


Si está en un shell interactivo sin inicio de sesión (shell sin inicio de sesión), se supone que ya ha visitado el shell de inicio de sesión, el entorno está configurado y se heredará.

En este caso, los dos archivos siguientes se ejecutan en orden, si existen:

  /etc/bash.bashrc
 ~ / .bashrc 

¿No hay una sola opción?


Si no está en el shell de inicio de sesión ni en el shell interactivo, su entorno estará vacío. Esto causa mucha confusión (ver trabajos cron a continuación).

En este caso, bash mira la variable BASH_ENV de su entorno y ejecuta el archivo correspondiente que se enumera allí.

Dificultades típicas y reglas generales


Cron jobs


En el 95% de los casos, he depurado el lanzamiento de bash debido a que el trabajo cron no funciona como se esperaba.

Esta maldita tarea funciona bien cuando la ejecuto en la línea de comando, pero falla al inicio en crontab .

Hay dos razones :

  • Los trabajos de Cron no son interactivos.
  • A diferencia de los scripts de línea de comandos, los trabajos cron no heredan el entorno de shell.

Por lo general, no se da cuenta ni le importa que el script de shell no sea interactivo porque el entorno hereda del shell interactivo. Esto significa que todos los PATH y alias configurados como espera.

Es por eso que a menudo tiene que establecer una PATH específica para la tarea cron, como aquí:

  * * * * * RUTA = $ {RUTA}: / ruta / a / mi / programa / carpeta myprogram 

Guiones que se llaman


Otro problema común es cuando las secuencias de comandos se configuran por error para llamarse entre sí. Por ejemplo, /etc/profile refiere a ~/.bashrc .

Por lo general, esto sucede cuando alguien intenta corregir algún tipo de error y todo parece funcionar. Desafortunadamente, cuando necesita separar estos diferentes tipos de sesiones, surgen nuevos problemas.

Imagen de Docker Sandbox


Para experimentar con el inicio de shell, creé una imagen de Docker que puede usar para depurar el inicio de shell en un entorno seguro.

Lanzamiento

 $ docker run -n bs -d imiell/bash_startup $ docker exec -ti bs bash 

Dockerfile está aquí .

Para forzar el inicio de sesión y simular el shell de inicio de sesión:

 $ bash --login 

Para verificar el conjunto de variables BASH_ENV :

 $ env | grep BASH_ENV 

Para depurar crontab se ejecutará crontab script simple cada minuto (en /root/ascript ):

 $ crontab -l $ cat /var/log/script.log 

Source: https://habr.com/ru/post/452410/


All Articles