Il y a ces deux noms: un sous - shell et un shell enfant .
Oui, un processus enfant sera lancé par l'un des éléments suivants:
sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
Sont-ils tous équivalents et partagent-ils le même nom? Tous partagent-ils les mêmes propriétés?
POSIX a cette définition :
Un environnement d'exécution de shell se compose de ....
Mais le dernier paragraphe du lien ci-dessus a ceci:
Un environnement de sous-shell doit être créé en tant que doublon de l'environnement de shell, sauf que les interruptions de signal qui ne sont pas ignorées doivent être définies sur l'action par défaut.
Et spécialement:
La substitution de commandes, les commandes regroupées entre parenthèses et les listes asynchrones doivent être exécutées dans un environnement de sous-shell. De plus, chaque commande d'un pipeline multi-commandes se trouve dans un environnement sous-shell; ....
Le sh -c 'echo "Hello"'
n'est pas inclus là-bas, cela devrait-il aussi être appelé un sous-shell?
sh -c
: c'est un sous-processus qui se trouve par hasard être un shell.bash -c <command>
, après fork du shell puis execvebash -c <command>
, un shell bash est créé. Ensuite, l'appel système est-il utilisé pour exécuter à<command>
nouveau le fork du shell bash et l'exécuter<command>
?Un environnement sous-shell n'a pas besoin de vivre dans un processus séparé, il a juste besoin de dupliquer l'environnement d'exécution actuel. En
ksh93
cela se fait par unvirtual sub-shell
mécanisme qui n'appelle pasfork()
. Cela rend ksh93 très rapide sur des plates-formes archaïquesWin-DOS
, commeWin-DOS
c'est extrêmement lent avec le forking.sh -c cmd
de l'autre côté crée un nouveau processus avec le shell par défaut qui n'a pas besoin d'être le même que votre shell interactif actuel.Même lorsque
sh
et votre shell actuel sont identiques, cela ne duplique pas l'environnement d'exécution et ne crée donc pas desub-shell
.la source
ksh93
, la sous-coquille est une coquille enfant, n'est-ce pas?