Ejecutando Bash en detalle

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.

Ejecutando Bash en detalle

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 aquí.

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

Añadir un comentario