Utilisations de la commande Exec dans les scripts Shell

Utilisations De La Commande Exec Dans Les Scripts Shell



Ce guide détaille la commande exec et son utilisation dans les scripts shell.

Conditions préalables:

Pour effectuer les étapes décrites dans ce guide, vous avez besoin des composants suivants :

  • Un système Linux fonctionnel. En savoir plus sur configurer une machine virtuelle Ubuntu à l'aide de VirtualBox .
  • Accéder à un utilisateur non root avec privilège sudo .
  • Un éditeur de texte adapté. Par exemple: Pourquoi / NéoVim , Nano , Texte sublime , VSCodium , etc.

La commande Exec

La commande exec n'est pas un outil séparé en soi :







$ qui exécutif



Il s'agit plutôt d'une commande interne du shell Bash :



$ homme exécutif





Comme le suggère la description de la page de manuel, si une commande est spécifiée, exec remplace le shell par celle-ci, ne créant aucun processus supplémentaire. Il existe une poignée d'options disponibles qui modifient le comportement de la commande exec.



Utilisation de base

Par défaut, chaque fois qu'une commande est exécutée, Bash génère un sous-shell et bifurque la commande.

$ écho $$ && dormir 999

$ ptree -p

Ici, la commande echo imprime le PID du shell actuel. Le shell Bash (PID : 978) génère un nouveau processus enfant pour fonctionner avec la commande sleep (PID : 8369).

Maintenant, que se passe-t-il si nous exécutons la commande sleep en utilisant exec ?

$ écho $$ && exécutif dormir 999

$ arbre_ps -p

Le processus Bash parent est remplacé par la commande sleep. En cas d'exécution réussie, il ne revient pas au shell. Au lieu de cela, la session est terminée.

Environnement propre

La configuration par défaut de Bash est livrée avec un tas de réglages et de variables d'environnement. Dans certains scénarios (débogage, par exemple), vous souhaiterez peut-être exécuter votre script/programme dans un environnement propre. Avec l'aide d'exec, nous pouvons lancer une instance de shell propre à la place de l'actuelle.

Tout d'abord, utilisez la commande printenv pour répertorier toutes les variables d'environnement actuellement configurées :

$ printenv

Maintenant, utilisez exec pour lancer une instance propre :

$ exécutif -c frapper

$ printenv

Lancer un shell différent

Outre Bash et 'sh', il existe plusieurs autres programmes shell disponibles, chacun avec ses avantages uniques. Si un programme/script nécessite un shell spécifique, vous pouvez utiliser exec pour remplacer le shell Bash actuel par celui souhaité.

Dans l'exemple suivant, nous remplaçons Bash par 'sh':

$ ptree -p

$ exécutif sh

$ ptree -p

Utilisation d'Exec dans les scripts

Une fois les bases éliminées, nous pouvons maintenant commencer à utiliser exec dans nos scripts shell.

Exemple 1 : Travailler avec différents shells

Découvrez le script suivant :

#!/bin/bash

écho $SHELL

écho 'echo zsh lancé avec succès' > zsh.sh

exécutif zsh zsh.sh

Ici, la première commande echo imprime le shell actuel. Par défaut, ce devrait être Bash. Ensuite, la commande exec lance « zsh » pour exécuter le script « zsh.sh ».

Exécutez le script suivant :

$ . / test.sh

Exemple 2 : Remplacer le processus existant

Chaque fois que vous appelez une commande/un programme, Bash génère un nouveau processus. Dans la plupart des situations, ce n'est pas un sujet de préoccupation. Cependant, lorsque vous travaillez avec un système avec des ressources très limitées (matériel embarqué, par exemple), l'utilisation de exec pour remplacer le processus existant en mémoire peut aider.

Découvrez le script suivant :

#!/bin/bash

ptree -p

exécutif ptree -p

écho 'Bonjour le monde'

Ici, la première commande pstree montre la disposition originale de l'arborescence des processus. Une fois la commande exec exécutée, la deuxième commande pstree remplace le shell en cours d'exécution. La commande echo de la dernière ligne ne s'est pas exécutée.

Exécutez le script suivant :

$ . / test.sh

Puisqu'il faisait partie du script, nous revenons au shell d'origine une fois l'exécution réussie.

Comme la commande exec remplace le shell parent par une commande/un programme différent, tout code suivant devient invalide. Soyez prudent lorsque vous les utilisez dans vos scripts.

Exemple 3 : Journalisation

Le shell Bash propose 3 descripteurs de fichiers uniques pour tout programme/script en cours d'exécution :

  • STDOUT (1) : sortie standard, stocke la sortie normale
  • STDERR (2) : erreur standard, stocke les messages d'erreur
  • STDIN (0) : entrée standard

En utilisant exec, nous pouvons rediriger ces descripteurs de fichiers vers un emplacement différent, par exemple : les fichiers journaux. Cela peut aider au débogage et à la journalisation en général.

Généralement, si vous souhaitez rediriger STDOUT et STDERR vers un fichier journal, vous utilisez l'opérateur de redirection :

$ écho $$ | tee test.log

$ moine 2 >& 1 | tee test.log

Cette méthode nécessite une redirection à chaque point que vous souhaitez enregistrer. Pour résoudre ce problème, nous pouvons utiliser la commande exec pour créer une redirection permanente pour la session shell. Consultez l'exemple suivant :

#!/bin/bash

> test.log

exécutif 1 >> test.log

exécutif 2 >& 1

écho 'Bonjour le monde'

mauvaise_commande

Ici, la première ligne crée un fichier journal vide. La première commande exec établit une redirection permanente de STDOUT vers le fichier journal. La deuxième commande exec redirige STDERR vers STDOUT.

Avec cette configuration, toutes les sorties et tous les messages d'erreur sont vidés dans le fichier journal :

$. / test.sh

$ chat test.log

Que se passe-t-il si le script génère des entrées de journal continues ?

#!/bin/bash

> test.log

exécutif 1 >> test.log

exécutif 2 >& 1

alors que vrai

faire

écho $ALÉATOIRE

dormir 5

fait

Ici, dans la première partie, nous créons une redirection permanente de STDOUT et STDERR vers notre fichier journal. La boucle while infinie exécute la commande echo jusqu'à ce que nous la fermions de force en utilisant 'Ctrl + C'. La variable $RANDOM est une variable spéciale qui renvoie une chaîne aléatoire à chaque accès.

Pour vérifier l'entrée du journal de mise à jour, utilisez la commande tail suivante :

$ queue -F test.log

Notez que cette redirection ne dure que pour la session shell.

Exemple 4 : entrée à partir d'un fichier

De la même manière que nous avons créé une redirection STDOUT et STDERR permanente, nous pouvons également en créer une pour STDIN. Cependant, étant donné que STDIN est utilisé pour l'entrée, l'implémentation est un peu différente.

Dans le script suivant, nous prenons STDIN à partir d'un fichier :

#!/bin/bash

écho 'écho ' Bonjour le monde '' > saisir

exec < saisir

lire ligne 1

eval $line_1

Ici, dans la première ligne, nous utilisons echo pour générer le contenu du fichier input_string en utilisant la redirection. La commande exec redirige le contenu de input_string vers STDIN de la session shell en cours. Après avoir lu la chaîne, nous utilisons eval pour traiter le contenu de $line_1 comme un code shell.

Exécutez le script suivant :

$ . / test.sh

Conclusion

Nous avons discuté de la commande exec dans Bash. Nous avons également présenté les différentes façons de l'utiliser dans des scripts. Nous avons démontré l'utilisation d'exec pour travailler avec plusieurs shells, créer des scripts économes en mémoire et rediriger les descripteurs de fichiers.

Ce n'est qu'une petite partie de ce qui peut être réalisé en utilisant les scripts Bash. En savoir plus sur les scripts Bash à partir du Programmation bash sous-catégorie.

Bonne informatique !