Detalles sobre el inicio de Bash

Si has encontrado esta página en la búsqueda, seguramente estás tratando de resolver algún problema con el inicio de bash.

Es posible que en tu entorno bash no esté configurada la variable de entorno y no entiendas por qué. Puede que hayas agregado algo en varios archivos de inicio de bash o en perfiles, o en todos los archivos al azar hasta que funcionó.

De todos modos, el objetivo de esta nota es explicar el procedimiento de inicio de bash de la forma más sencilla posible, para que puedas abordar los problemas.

Diagrama

Este diagrama resume todos los procesos al iniciar bash.

Detalles sobre el inicio de Bash

Ahora analizaremos cada parte en detalle.

¿Shell de Login?

Primero debes determinar si estás en un shell de login o no.

Un shell de login es el primer shell al que accedes al iniciar sesión en un sistema para una sesión interactiva. Un shell de login no requiere que ingreses un nombre de usuario y contraseña. Puedes forzar el inicio de un shell de login añadiendo el flag --login al llamar a bash, por ejemplo:

bash --login

El shell de login configura el entorno básico al iniciar por primera vez el shell bash.

¿Interactivo?

Luego determines si el shell es interactivo o no.

Esto se puede verificar mediante la variable PS1 (establece la función de entrada de comandos):

if [ "${PS1-}" ]; then
  echo interactive
else
  echo non-interactive
fi

O puedes comprobar si el parámetro , el intervalo entre el envío de paquetes.está establecido, usando la variable especial del guion - en bash, por ejemplo:

$ echo $-

Si en la salida hay un símbolo i, entonces el shell es interactivo.

¿En un shell de login?

Si estás en un shell de login, bash busca el archivo /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 ejecuta y omite los demás.

¿En un shell interactivo?

Si estás en un shell interactivo sin login (non-login shell), se asume que ya has estado en un shell de login, el entorno está configurado y será heredado.

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

/etc/bash.bashrc
~/.bashrc

¿Ninguna opción?

Si no estás en un shell de login ni en un shell interactivo, tu entorno realmente estará vacío. Esto causa mucha confusión (ver más abajo sobre trabajos cron).

En este caso, bash mira la variable BASH_ENV de tu entorno y crea el archivo correspondiente que se indique allí.

Dificultades comunes y reglas empíricas

Trabajos cron

En el 95% de los casos, la depuración del inicio de bash está relacionada con que la tarea cron no se comporta como se esperaba.

Esta maldita tarea funciona correctamente cuando la inicio desde la línea de comandos, pero falla al ejecutarse en crontab.

Aquí dos razones:

  • Las tareas cron no son interactivas.
  • A diferencia de los scripts en la línea de comandos, las tareas cron no heredan el entorno de la terminal.

Normalmente no te das cuenta o no te preocupa que el script de shell no sea interactivo, porque el entorno se hereda de la terminal interactiva. Esto significa que todo PATH y alias está configurado como esperas.

Por eso a menudo es necesario establecer un específico PATH para la tarea cron, como aquí:

* * * * * PATH=${PATH}:\/path\/to\/my\/program\/folder myprogram

Scripts que se llaman entre sí

Otro problema común es cuando los scripts se configuran erróneamente para llamarse entre sí. Por ejemplo, /etc/profile se refiere a ~~/.bashrc.

Esto suele suceder cuando alguien ha intentado corregir un error y aparentemente todo funcionó. Desafortunadamente, cuando se necesita separar estos diferentes tipos de sesiones, surgen nuevos problemas.

Imagen de Docker en un entorno aislado

Para experimentar con el inicio de la terminal, creé una imagen de Docker que se puede utilizar para depurar el inicio de la terminal en un entorno seguro.

Inicio:

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

El Dockerfile se encuentra en aquí.

Para iniciar sesión forzosamente e imitar un inicio de sesión en la terminal:

$ bash --login

Para verificar el conjunto de variables BASH_ENV:

$ env | grep BASH_ENV

Para depuración crontab cada minuto se ejecutará un simple script (en /root/ascript):

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

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster