Dans Advanced Bash-Scripting Guide , dans l' exemple 27-4 , 7ème ligne du bas, j'ai lu ceci:
Une fonction s'exécute comme un sous-processus.
J'ai fait un test dans Bash, et il semble que la déclaration ci-dessus soit fausse.
Les recherches sur ce site, Bash Man, et mon moteur de recherche n'apportent aucune lumière.
Avez-vous la réponse et souhaitez-vous expliquer?
Réponses:
Le Guide de script Bash avancé n'est pas toujours fiable et ses exemples de scripts contiennent des pratiques obsolètes telles que l'utilisation des raccourcis efficacement déconseillés pour la substitution de commandes, c'est-à-dire
`command`
plutôt que$(command)
.Dans ce cas particulier, c'est manifestement incorrect.
La section sur les fonctions shell du manuel (canonique) de Bash déclare définitivement que
la source
Les fonctions d'accolade seront exécutées dans le processus de shell appelant, à moins qu'elles n'aient besoin de leur propre sous-shell qui est:
&
Redirection ou env supplémentaire. les variables ne forceront pas un nouveau sous-shell:
Si vous définissez la fonction entre parenthèses au lieu de curlies:
il s'exécutera toujours dans un nouveau processus.
La substitution de commandes
$()
crée également toujours des processus dans bash (mais pas dans ksh si vous exécutez des commandes internes).la source
f() (...)
autorisé. Y a-t-il d'autres définitions en dehors de{...}
et(...)
? Dans Bash, je ne suis pas encore dans les autres.function hw { echo hello world; }
syntaxe (inutile()
si vous tapezfunction
et vous pouvez spécifier des redirections juste après la finale}
ou)
commehw(){ echo error; } >&2
dedans. C'est à peu près tout.f()(...)
toujours exécuter un propre shell, maisf(){...}
pas.foo() [[ x = x ]]
qu'une définition de fonction valide. Cependant, si vous regardez la fonction avec,type foo
vous verrez que c'est toujours du sucre syntaxique pourfoo() { [[ x = x ]]; }
. Il en va de même pour les fonctions de sous-shell:bar() ( : )
devientbar() { ( : ); }
.La commande en question de cet exemple ressemble à:
L'exemple indique plus tard:
Étant charitable pour ABS Guide, ce qu'ils voulaient apparemment écrire, c'est que la fonction s'exécute à l'intérieur d'une substitution de commande et que la commande à l'intérieur d'une substitution de commande s'exécute dans un sous - shell .
la source