Recherche de site Web

Apprenez la différence entre le sourcing et le forking dans Bash


L'objectif principal de cet article est de comprendre clairement ce qui se passe lorsque vous exécutez le script vs source du script dans bash. Tout d'abord, nous comprendrons clairement comment le programme est soumis lorsque vous appelez le script de différentes manières.

REMARQUE : la création du script avec une extension n'a pas d'importance. Le script fonctionnera correctement même sans extensions.

Fondamentalement, chaque script commence par une ligne appelée shebang(#!). Le symbole Hash dans bash sera interprété comme un commentaire mais shebang a une signification particulière. Il indique à bash de soumettre le programme dans l'interprète que vous avez mentionné dans shebang.

Vous trouverez ci-dessous un exemple de programme et je spécifie bash comme interprète.

cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

chmod +x Hello_world.sh

Maintenant, pour exécuter le script, vous pouvez le faire de deux manières.

  • Utilisez un chemin relatif pour appeler le script. Accédez au répertoire où le script est présent et exécutez ./Hello_world.sh.
  • Utilisez le chemin absolu pour appeler le script. Depuis n’importe où dans le système de fichiers, saisissez le chemin complet du script.
./Hello_world.sh
pwd
/home/karthick/Hello_world

Voyons maintenant ce qui se passe lorsque vous essayez de soumettre votre programme sans shebang. En l'absence de shebang, le programme sera soumis au shell actuel avec lequel vous exécutez. Dans mon cas, il s'agit de Bash (/bin/bash).

Permettez-moi de vous montrer un exemple. Je crée un script python sans shebang et lorsque j'appelle le programme, bash ne sait pas qu'il doit soumettre ce programme à l'interpréteur python à la place, il exécutera le programme dans le shell actuel.

cat > run-py.py
echo $SHELL
print("Hello world")

chmod +x run-py.py
./run-py.py

Dans ce cas, vous pouvez appeler le programme en mentionnant sur quel interprète il doit être soumis ou simplement ajouter la ligne shebang qui est toujours recommandée.

which python3
$(which python3) /home/karthick/run_py.py

Maintenant que vous savez comment appeler le script, l'étape suivante consisterait à comprendre ce qui se passe lorsque nous appelons le script. Lorsque vous invoquez le script comme indiqué dans les exemples ci-dessus, il créera un processus enfant (forking) et le script sera soumis au processus enfant. J'ai exécuté un exemple de script qui exécutera simplement la commande suivante et montrera que le script est soumis à un processus enfant.

ps -ef --forest | grep -i bash

Il peut y avoir plusieurs processus enfants dans le cadre du script et cela dépend de notre code. Il est à noter que les variables d'environnement créées par l'indice seront supprimées une fois l'opération terminée. Un processus enfant peut accéder aux variables créées par le processus parent en les exportant. Mais le processus parent ne peut pas accéder aux variables créées par le processus enfant.

Jetez un œil aux articles ci-dessous pour mieux comprendre le fonctionnement des variables et comment exporter les variables.

  • Comprendre et écrire des « variables Linux » dans les scripts Shell
  • Apprenez la différence entre $$et $BASHPID dans Bash

Sourcer le script

« Source » est une commande intégrée au shell qui lit le fichier qui lui est passé en argument et exécute le code dans l'environnement shell actuel. Un cas d'utilisation approprié que vous utilisez principalement consiste à modifier votre configuration dans .bashrc ou .bash_profile et à recharger les modifications à l'aide de la commande source.

type -a source

Il existe deux manières syntaxiques d'exécuter la commande source. Vous pouvez choisir n'importe qui parmi deux syntaxes et c'est un choix personnel.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

Laissez-moi vous montrer comment fonctionne réellement la source. Je vais créer deux scripts shell. Le premier script (Module.sh) va contenir quelques variables et fonctions. Le deuxième script (Main.sh) va imprimer la variable et appeler la fonction.

Fichier Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

Fichier Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Définissez l'autorisation d'exécution pour le script et appelez le script principal « main.sh ». Maintenant, ce script tentera de trouver la fonction f1 et la variable VAR1 dans l'environnement shell actuel et échouera avec la commande introuvable.

bash main.sh

Lançons maintenant la commande source dans le script qui chargera la variable et les fonctions dans l'environnement shell actuel et qui sera accessible par « main.sh ».

Fichier Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

Fichier Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Maintenant, exécutez à nouveau le script et voyez.

bash main.sh

La source est très utile dans bash pour suivre l'approche de programmation modulaire dans la création de nos scripts shell. Nous pouvons diviser notre code en modules plus petits et pouvons être utilisés dans de nombreux programmes. De cette manière, nous pouvons suivre le principe DRY (Ne vous répétez pas).

C'est tout pour cet article. Nous avons brièvement discuté de la différence entre le sourcing et le fork dans bash. Parcourez l'article et partagez vos précieux commentaires avec nous.