Le sous-marin n'est pas créé si vous exécutez des commandes sans votre chemin?

je lis un livre "

Ligne de commande Linux et scripts de coquille biblique

"3ème édition. Sur la page 279 Je cite:

"Les commandes de signature créent ce qu'on appelle

subshell

Exécuter la commande ci-jointe. Pétrole - Il s'agit d'une filiale distincte créée à partir de la coquille, dans laquelle le script est effectué. Pour cette raison, toutes les variables que vous créez dans les scripts ne sont pas disponibles pour l'équipe sous-marine.

Les puides sont également créés si vous exécutez la commande de la ligne de commande avec

./

path, Mais ils ne seront pas créés si vous venez d'exécuter l'équipe sans la voie ".

La dernière phrase me confond. J'ai testé un script simple qui exporte des variables; Variables n'existera pas après l'existence du script, mais le script est appelé à partir de

./

manière ou placez le script dans

/usr/bin

Et courez-le sans une manière. Il me semble qu'il n'y a pas de différence telle qu'elle s'appelle par rapport au sous-marin.

Qu'est-ce que j'ai raté?
Invité:

Dominique

Confirmation de:

"Le réglage des commandes crée le dit sous-marin pour effectuer la commande imbriquée. Pétrole - Il s'agit d'une filiale distincte, créée à partir de la coquille, qui exécute le script.

Nous parlons de telles structures comme suit:

echo "$(date) `uname -r`"

Dans cet exemple, je provoque deux sous-marins en utilisant deux notations supportées différentes pour les subordons. Le premier sous-marin lance

date

équipe et le deuxième sous-marin commence

uname

équipe. DANS

echo

La commande est effectuée par la coque source après avoir terminé le travail des deux sous-marins.

Pour cette raison, toutes les variables que vous créez dans les scripts ne sont pas disponibles pour l'équipe sous-marine.

Ici, l'auteur est revenu à l'avance. Les variables créées avant d'appeler le sous-marin sont disponibles pour sous-marin. Les variables créées à l'intérieur du sous-marin ne sont disponibles que pour le sous-marin et disparaissent après la fin du sous-marin.

Les poids sont également créés si vous exécutez la commande à partir de la ligne de commande en utilisant le chemin ./, mais ils ne sont pas créés si vous courez juste l'équipe sans la voie ».

Il n'est pas clair que l'auteur essaie de dire ici. Si vous appelez une commande externe, les éléments suivants se produiront, que cela soit appelé avec ou sans elle:

Coquille

fork

s, Créer un nouveau processus.

Le processus enfant nouvellement créé effectue n'importe laquelle de la redirection d'E / S spécifiée.

Un processus enfant effectue une commande externe, après quoi les processus cessent d'être une coquille et de devenir le programme externe. (Quoi, bien sûr, peut être un script shell).

Il s'agit d'un nouveau processus, de sorte que toute variables définies par l'équipe externe ne sera pas disponible pour le processus parent, comme s'il s'agissait d'un sous-marin.

L'auteur pourrait garder à l'esprit l'un des trois scénarios suivants:

La commande externe est un script incorrect formaté et, dans ce cas, la coque provoquée peut fonctionner sur un formatage incorrect, devinant quelle utilisation de shell utilise pour interpréter le script. (Ce script est tellement imprévisible que je recommande vivement de ne pas compter sur elle. Bonne façon de trouver un interprète - ont

#!

Rangée au début du script.)

Peut-être appelez-vous une commande interne, par exemple

read

, quelle syntaxe ressemble à une commande externe trouvée en recherchant

PATH

. Mais même si elle est syntaxiquement, elle ressemble également à elle, il se comportera différemment. dans la mesure où

read

établira une variable destinée à être utilisée par les commandes suivantes,

read

lui-même doit se produire dans le processus actuel sans aucun

fork

appeler. (Même les commandes internes pouvant être appelées en toute sécurité en tant que sous-processus, il est préférable de se produire dans le processus actuel pour considérer les performances. Appeler

fork

Cela semble cher.)

Vous pouvez recevoir des équipes shell en utilisant

. file

ou

source file

. Dans ce cas

file

Ce n'est pas un script, mais il ressemble à quelque chose. Toutes les équipes B.

file

sera appelé la coquille actuelle sans appel préalable

fork

. (Mais, bien sûr, des équipes à l'intérieur

file

peut causer

fork

appels). Dans ce cas, tout

#!

Ligne B.

file

sera ignoré et toutes les variables définies

file

sera disponible pour votre shell actuel.

Pour répondre aux questions, connectez-vous ou registre