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