Exécuter Bash en détail

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.

Exécuter Bash en détail

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 ici.

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

Ajouter un commentaire