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