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