Question

Pour autant que je sais qu'il ya deux façons de créer des variables locales dans une fonction bash:. Créer un sous-shell ou déclarer chaque variable locale

Par exemple:

# using local
function foo
{
  local count
  for count in $(seq 10)
  do
    echo $count
  done
}

ou

# using subshell
function foo
{
  (
    for count in $(seq 10)
    do
      echo $count
    done
  )
}

obvisously la version en utilisant la sous-couche est plus simple à écrire parce que vous ne devez pas se soucier de déclarer toutes les variables variables locales (sans parler (environnement) créé / exporté par des outils tels que getopts ). Mais je ne pouvais imaginer que la création d'un sous-shell a une surcharge.

Alors, quelle est la meilleure approche? Quels sont les avantages / inconvénients?

Était-ce utile?

La solution

Création d'un sous-shell implique un fork(), donc il a certainement les frais généraux par rapport à une variable locale. Bien que les sous-coques ne coûtent pas cher - vous ne vous inquiétez pas au sujet de leur coût quand vous en avez besoin - ils ne sont pas libres

.

Si votre script va être fortement utilisé et de la performance qui compte vraiment (vous aurez des centaines d'utilisateurs tous en cours d'exécution en même temps, plusieurs fois par jour), alors vous pourriez se soucier du coût de la performance des sous -coquille. OTOH, si vous exécutez une fois par mois et le script comme un parcours entier pour moins de 10 secondes, vous le feriez probablement pas.

Cependant, en termes de clarté, il est préférable d'être explicite et déclarer les variables - il réduit le risque de rupture de script parce que quelqu'un vient et dit: « ce sous-shell est manifestement pas nécessaire » (et est vraiment pas,. Je veux supprimer les sous-coquilles de vos fonctions)

Regardez l'évolution des scripts Perl. Ils ont commencé comme libre pour toutes les variables à venir à l'existence à la demande. Ils sont devenus progressivement plus rigoureux, avec style normal étant maintenant Prédéclarer toutes les variables. Dans une certaine mesure, des obus ont suivi une voie similaire - mais pas aussi rigoureusement que Perl. Awk est également une étude de cas intéressante; ses fonctions utilisent des variables globales à moins qu'ils sont des arguments à la fonction, ce qui conduit à des fonctions écrites avec 3 arguments actifs (disons) et 5 arguments inactifs qui définissent efficacement les variables locales. Il est un peu excentrique, mais il « fonctionne ».

Autres conseils

Maintenant, en vous assurant que toutes les fonctions déclarent toujours que toutes les variables locales, est assez difficile.

Je pense que cela est très sujette aux erreurs et préfère toujours utiliser les fonctions de sous-shell-:

f() (
 echo "we are a subshell"
)

Pas besoin de déclarer des variables locales - mais aussi aucun moyen de changer les variables globales. Ce qui est bon à mon avis!

Une autre conséquence est que vous avez toujours besoin de vérifier le code retour / sortie de ces fonctions et agir en conséquence! Ceci est, parce que vous ne pouvez pas vous quitter script dans une fonction de sous-shell!

f() (
   echo "Trying to exit"
   exit 1
)

f
echo "Did not exit"

Ce ne sera pas quitter votre script. Vous devez le faire de cette façon:

f() (
   echo "Trying to exit"
   exit 1
)

f || exit $?
echo "Did not exit"

quittera

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top