Lancement de Bash en détail

Si vous avez trouvé cette page dans une recherche, vous essayez probablement de résoudre un problÚme avec l'exécution de bash.

Il est possible que votre environnement bash ne définisse pas de variable d'environnement et que vous ne compreniez pas pourquoi. Vous pouvez avoir inséré quelque chose dans divers fichiers de démarrage bash ou dans des profils, ou dans tous les fichiers au hasard jusqu'à ce que cela fonctionne.

Dans tous les cas, le but de cette note est de décrire la procédure de démarrage de bash aussi facilement que possible afin de pouvoir résoudre les problÚmes.

Graphique


Cet organigramme résume tous les processus lors du démarrage de bash.



Examinons maintenant de plus prĂšs chaque partie.

Login Shell?


Vous devez d'abord choisir si vous ĂȘtes dans le shell de connexion ou non.

Le shell de connexion est le premier shell que vous entrez lorsque vous vous connectez à une session interactive. Le shell de connexion ne nécessite pas de nom d'utilisateur ni de mot de passe. Vous pouvez forcer le lancement du shell de connexion en ajoutant l'indicateur --login lors de l'appel de bash , par exemple:

  bash --login 

Le shell de connexion configure l'environnement de base lors de la premiÚre exécution du shell bash.

Interactif?


Ensuite, vous déterminez si le shell est interactif ou non.

Cela peut ĂȘtre vĂ©rifiĂ© par la prĂ©sence de la variable PS1 (elle dĂ©finit la fonction d'entrĂ©e de commande):

  if ["$ {PS1-}"];  alors
   écho interactif
 d'autre
   écho non interactif
 fi 

Ou voyez si l'option -i est définie à l'aide d'une variable de trait d'union spéciale dans bash, par exemple:

  $ echo $ - 

S'il y a un i dans la sortie, alors le shell est interactif.

Dans le shell de connexion?


Si vous ĂȘtes dans le shell de connexion, bash recherche le fichier /etc/profile et s'exĂ©cute s'il existe.

Il recherche ensuite l'un de ces trois fichiers dans l'ordre suivant:

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

Quand il en trouve un, il le lance et saute les autres.

Dans un shell interactif?


Si vous ĂȘtes dans un shell interactif sans connexion (shell sans connexion), il est supposĂ© que vous avez dĂ©jĂ  visitĂ© le shell de connexion, l'environnement est configurĂ© et sera hĂ©ritĂ©.

Dans ce cas, les deux fichiers suivants sont exécutés dans l'ordre, s'ils existent:

  /etc/bash.bashrc
 ~ / .bashrc 

Pas une seule option?


Si vous n'ĂȘtes ni dans le shell de connexion ni dans le shell interactif, votre environnement sera en effet vide. Cela provoque beaucoup de confusion (voir les tĂąches cron ci-dessous).

Dans ce cas, bash examine la variable BASH_ENV de votre environnement et exécute le fichier correspondant qui y est répertorié.

Difficultés et rÚgles générales typiques


Emplois Cron


Dans 95% des cas, j'ai débogué le lancement bash car le travail cron ne fonctionne pas comme prévu.

Cette fichue tùche fonctionne trÚs bien lorsque je l'exécute sur la ligne de commande, mais échoue lorsqu'elle est exécutée dans crontab .

Il y a deux raisons :

  • Les tĂąches Cron ne sont pas interactives.
  • Contrairement aux scripts de ligne de commande, les tĂąches cron n'hĂ©ritent pas de l'environnement shell.

Habituellement, vous ne remarquez pas ou ne vous souciez pas que le script shell n'est pas interactif car l'environnement hérite du shell interactif. Cela signifie que tous les PATH et alias configurés comme prévu.

C'est pourquoi vous devez souvent définir un PATH spécifique pour la tùche cron, comme ici:

  * * * * * CHEMIN = $ {CHEMIN}: / chemin / vers / mon / programme / dossier monprogramme 

Scripts qui s'appellent


Un autre problĂšme courant est lorsque les scripts sont configurĂ©s par erreur pour s’appeler. Par exemple, /etc/profile fait rĂ©fĂ©rence Ă  ~/.bashrc .

Habituellement, cela se produit lorsque quelqu'un essaie de corriger une sorte d'erreur et que tout semble fonctionner. Malheureusement, lorsque vous devez séparer ces différents types de sessions, de nouveaux problÚmes surviennent.

Sandbox Docker Image


Pour expérimenter avec le démarrage du shell, j'ai créé une image Docker que vous pouvez utiliser pour déboguer le démarrage du shell dans un environnement sûr.

Lancement:

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

Dockerfile est ici .

Pour forcer la connexion et simuler le shell de connexion:

 $ bash --login 

Pour vérifier l'ensemble de variables BASH_ENV :

 $ env | grep BASH_ENV 

Pour déboguer crontab simple script sera exécuté toutes les minutes (dans /root/ascript ):

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

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


All Articles