Si vous avez trouvé cette page lors d'une recherche, vous essayez probablement de résoudre un problème lié à l'exécution de bash.
Peut-être que votre environnement bash ne définit pas de variable d'environnement et vous ne comprenez pas pourquoi. Vous avez peut-être bloqué quelque chose dans divers fichiers ou profils de démarrage bash ou dans tous les fichiers au hasard jusqu'à ce que cela fonctionne.
Dans tous les cas, le but de cette note est de présenter la procédure de démarrage de bash aussi simplement que possible afin que vous puissiez résoudre les problèmes.
Диаграмма
Cet organigramme résume tous les processus lors de l'exécution de bash.
Examinons maintenant de plus près chaque partie.
Coquille de connexion ?
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 démarrage du shell de connexion en ajoutant un indicateur --login
lorsqu'il est appelé bash
, Par exemple:
bash --connexion
Le shell de connexion configure l'environnement de base lorsque vous démarrez pour la première fois le shell bash.
Interactif?
Ensuite, vous déterminez si le shell est interactif ou non.
Ceci peut être vérifié par la présence de la variable PS1
(il installe la fonction de saisie de commande) :
si [ "${PS1-}" ]; puis écho interactif sinon écho non interactif fi
Ou voyez si l'option est définie -i
, en utilisant une variable de trait d'union spéciale -
en bash, par exemple :
$écho$-
S'il y a un symbole dans la sortie i
, alors le shell est interactif.
Dans le shell de connexion ?
Si vous êtes dans un shell de connexion, bash recherche le fichier /etc/profile
et s'exécute s'il existe.
Recherche ensuite l'un de ces trois fichiers dans l'ordre suivant :
~/.bash_profile ~/.bash_login ~/.profile
Lorsqu'il en trouve un, il le démarre et ignore les autres.
Dans un shell interactif ?
Si vous êtes dans un shell sans connexion, on suppose que vous avez déjà été dans un 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 d'option?
Si vous n'êtes ni dans un shell de connexion ni dans un shell interactif, alors votre environnement sera effectivement vide. Cela provoque beaucoup de confusion (voir ci-dessous à propos des tâches cron).
Dans ce cas, bash regarde la variable BASH_ENV
votre environnement et crée le fichier correspondant qui y est spécifié.
Difficultés courantes et règles empiriques
emplois cron
95% du temps, je débogue le démarrage de bash, c'est parce que la tâche cron ne s'exécute pas comme prévu.
Cette foutue tâche fonctionne bien lorsque je l'exécute sur la ligne de commande, mais échoue lorsque je l'exécute dans crontab.
il est 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.
En règle générale, vous ne remarquerez pas ou ne vous soucierez pas du fait qu'un script shell n'est pas interactif car l'environnement hérite du shell interactif. Cela signifie que tout PATH
и alias
configuré comme vous vous en doutez.
C'est pourquoi il est souvent nécessaire de définir un PATH
pour une tâche cron comme ici :
* * * * * PATH=${PATH}:/chemin/vers/mon/programme/dossier monprogramme
Des scripts s'appelant
Un autre problème courant survient lorsque les scripts sont configurés par erreur pour s'appeler. Par exemple, /etc/profile
fait appel à ~/.bashrc
.
Cela se produit généralement lorsque quelqu’un essaie de corriger une erreur et que tout semble fonctionner. Malheureusement, lorsqu’il faut séparer ces différents types de séances, de nouveaux problèmes surgissent.
Image Docker en bac à sable
Pour expérimenter l'exécution d'un shell, j'ai créé une image Docker qui peut être utilisée pour déboguer l'exécution d'un shell dans un environnement sécurisé.
Lancer:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile se trouve
Pour forcer la connexion et simuler un shell de connexion :
$ bash --login
Pour tester un ensemble de variables BASH_ENV
:
$ env | grep BASH_ENV
Pour le débogage crontab
un simple script sera exécuté toutes les minutes (en /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Source: habr.com