Si encontró esta página en una búsqueda, probablemente esté intentando resolver algún problema con la ejecución de bash.
Quizás su entorno bash no esté configurando una variable de entorno y no comprenda por qué. Es posible que haya bloqueado algo en varios archivos o perfiles de arranque de bash o en todos los archivos al azar hasta que funcionó.
En cualquier caso, el objetivo de esta nota es exponer el procedimiento para iniciar bash de la forma más sencilla posible para que pueda solucionar los problemas.
Диаграмма
Este diagrama de flujo resume todos los procesos al ejecutar bash.
Ahora echemos un vistazo más de cerca a cada parte.
¿Iniciar sesión en Shell?
Primero debes elegir si estás en el shell de inicio de sesión o no.
El shell de inicio de sesión es el primer shell al que ingresa cuando inicia sesión para una sesión interactiva. El shell de inicio de sesión no requiere un nombre de usuario ni contraseña. Puede forzar el inicio del shell de inicio de sesión agregando una bandera --login
cuando se llama bash
, Por ejemplo:
bash --iniciar sesión
El shell de inicio de sesión configura el entorno base cuando inicia el shell bash por primera vez.
¿Interactivo?
Luego determinas si el shell es interactivo o no.
Esto se puede comprobar por la presencia de la variable PS1
(instala la función de entrada de comando):
si [ "${PS1-}" ]; luego eco interactivo, de lo contrario eco no interactivo fi
O ver si la opción está configurada -i
, usando una variable de guión especial -
en bash, por ejemplo:
$eco$-
Si hay un símbolo en la salida i
, entonces el shell es interactivo.
¿En el shell de inicio de sesión?
Si está en un shell de inicio de sesión, bash busca el archivo /etc/profile
y se ejecuta si existe.
Luego busca cualquiera de estos tres archivos en el siguiente orden:
~/.bash_profile ~/.bash_login ~/.profile
Cuando encuentra uno, lo inicia y se salta los demás.
¿En un caparazón interactivo?
Si está en un shell sin inicio de sesión, se supone que ya ha estado en un 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
¿Ninguna opción?
Si no está en un shell de inicio de sesión ni en un shell interactivo, entonces su entorno estará vacío. Esto causa mucha confusión (ver más abajo sobre trabajos cron).
En este caso, bash mira la variable. BASH_ENV
su entorno y crea el archivo correspondiente especificado allí.
Dificultades comunes y reglas generales
trabajos cron
El 95% de las veces que depuro el inicio de bash es porque el trabajo cron no se ejecuta como se esperaba.
Esta maldita tarea funciona bien cuando lo ejecuto en la línea de comando, pero falla cuando lo ejecuto en crontab.
es dos razones:
- Los trabajos cron no son interactivos.
- A diferencia de los scripts de línea de comandos, los trabajos cron no heredan el entorno del shell.
Por lo general, no notará ni le importará que un script de shell no sea interactivo porque el entorno hereda del shell interactivo. Esto significa que todo PATH
и alias
configurado como era de esperar.
Por este motivo, a menudo es necesario establecer un límite específico. PATH
para una tarea cron como aquí:
* * * * * RUTA=${RUTA}:/ruta/a/mi/programa/carpeta miprograma
Guiones que se llaman entre sí
Otro problema común es cuando los scripts se configuran por error para llamarse entre sí. Por ejemplo, /etc/profile
apela a ~/.bashrc
.
Esto suele suceder cuando alguien intentó corregir algún error y todo parecía funcionar. Desafortunadamente, cuando es necesario separar estos diferentes tipos de sesiones, surgen nuevos problemas.
Imagen de Docker en espacio aislado
Para experimentar con la ejecución de un shell, creé una imagen de Docker que se puede usar para depurar la ejecución de un shell en un entorno seguro.
Lanzar:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile se encuentra
Para forzar el inicio de sesión y simular un shell de inicio de sesión:
$ bash --login
Para probar un conjunto de variables BASH_ENV
:
$ env | grep BASH_ENV
Para depurar crontab
Se ejecutará un script simple cada minuto (en /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Fuente: habr.com