GNU/Linux >> Tutoriels Linux >  >> Linux

Qu'est-ce que le sous-shell sous Linux ?

Vous connaissez déjà shell. C'est un programme qui vous permet d'exécuter des commandes sous Linux. Votre principale interaction avec le shell est lorsque vous exécutez des commandes dans un terminal.

Tôt ou tard, vous rencontrerez un terme appelé "sous-shell" et cela peut vous dérouter.

Qu'est-ce qu'un sous-shell ?

Un sous-shell est essentiellement un nouveau shell juste pour exécuter un programme souhaité. Un sous-shell peut accéder aux variables globales définies par le 'shell parent' mais pas aux variables locales. Toute modification apportée par un sous-shell à une variable globale n'est pas transmise au shell parent.

Cela a-t-il du sens? Probablement pas. Laissez-moi vous expliquer les choses en détail avec des exemples.

Voici un script d'une ligne qui affiche la valeur de la variable 'var'.

echo $var

J'ai défini la valeur de cette variable sur LHB, à votre avis, qu'est-ce qui s'affichera lors de l'exécution du script ?

Surprise! Le script ne voit pas la valeur de la variable var que j'avais défini plus tôt.

Les scripts shell s'exécutent dans le sous-shell (par défaut)

Pourquoi? Parce que lorsque vous exécutez un script shell, il s'exécute dans son propre shell. Étant donné que ce shell provient d'un autre shell (où vous définissez la variable et où vous exécutez le script), il s'appelle un sous-shell.

Le script shell n'a pas pu voir la valeur de la variable car il s'agissait d'une variable locale et elle n'était pas connue du shell nouvellement créé. Si vous voulez que la variable soit accessible par ses sous-shells, vous devrez utiliser la commande export et la transformer en variable globale.

Vous pouvez également créer un sous-shell en lançant de nouveaux shells à partir de vos shells existants. Exécutez simplement bash et vous serez dans un sous-shell. Vous pouvez utiliser la commande exit pour fermer/quitter le shell et revenir au shell d'origine.

Ne considérez pas le sous-shell comme une nouvelle fenêtre de terminal. Je sais que c'est difficile à visualiser mais c'est comme ça.

J'ai utilisé la variable pour montrer la différence entre les deux shells (parent et sous-shell). La variable var n'a pas été exporté dans ce cas et n'était donc pas connu du sous-shell.

Sous-shells imbriqués

Vous pouvez également créer des sous-shells imbriqués, de la même manière. Une fois qu'une variable est exportée, elle reste exportée vers tous les sous-shells créés par la suite.

Vous pouvez modifier la valeur de la variable exportée dans un sous-shell. La valeur modifiée sera transmise aux sous-shells suivants (car la variable elle-même est globale) mais si vous la quittez et revenez au shell d'origine, la valeur d'origine est conservée.

Pourquoi? Parce que la valeur de la variable exportée est copiée dans le sous-shell. Et c'est la copie qui est changée (de LHB à HOC). La valeur d'origine reste la même dans le shell parent.

Alors gardez cela à l'esprit, il n'y a aucun moyen de changer la valeur d'une variable dans un shell parent depuis un sous-shell . Peu importe si vous exportez la variable ou non, la variable ne sera pas modifiée dans le shell parent.

Astuce bonus :exécuter un script shell dans le shell actuel

Le comportement normal est qu'un script shell est exécuté dans son propre shell, c'est-à-dire un sous-shell.

Vous pouvez modifier ce comportement et exécuter un script shell dans le shell actuel grâce à la commande shell intégrée appelée point (.).

Non, ce n'est pas la même chose que d'exécuter un script shell comme celui-ci ./script. Au lieu de cela, vous l'exécutez comme ceci :

. script

De cette façon, les commandes du script sont exécutées par le shell actuel comme si elles étaient saisies dans le terminal au lieu d'être exécutées via un script dans un sous-shell. Les scripts peuvent accéder aux variables locales de cette façon.

Je pense que c'est une assez bonne information sur le sous-shell sous Linux.

En avez-vous une meilleure compréhension maintenant ou êtes-vous plus confus que jamais? N'hésitez pas à vous exprimer dans les commentaires en tant que membre LHB.


Linux
  1. Qu'est-ce qu'Umask sous Linux

  2. Pourquoi une variable est-elle visible dans un sous-shell ?

  3. Comment changer de shell sous Linux

  4. Quels sont les différents types de shells sous Linux ?

  5. Que fait % dans les chaînes du shell Linux ?

Explication de la commande d'exportation sous Linux

Qu'est-ce que le shell de connexion sous Linux ?

Qu'est-ce que Shebang dans Linux Shell Scripting ?

Qu'est-ce que la moyenne de charge sous Linux ?

Qu'est-ce qu'un fichier .bashrc sous Linux ?

Qu'est-ce qu'un fichier .sh ?