Frage

Soweit ich weiß, gibt es zwei Möglichkeiten, lokale Variablen in einer Bash-Funktion zu erstellen: a. Subshell erstellen oder jede Variable als lokal deklarieren

Zum Beispiel:

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

oder

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

Obvisously die Version der Sub-Shell verwendet, ist einfacher zu schreiben, weil Sie müssen nicht interessieren alle Variablen lokal zu erklären (nicht zu erwähnen (Umwelt) Variablen erstellt / exportiert von Tools wie getopts ). Aber ich könnte mir vorstellen, dass ein Sub-Shell die Schaffung einen Overhead hat.

Also, was ist der bessere Ansatz? Was sind die Vor / Nachteile?

War es hilfreich?

Lösung

eine Unterschale Erstellen beinhaltet einen fork(), so ist es auf jeden Fall Overhead mit einer lokalen Variablen verglichen hat. Während Unterschalen billig sind - Sie keine Sorge um ihre Kosten, wenn man einen braucht - sie sind nicht frei

.

Wenn Ihr Skript wird stark genutzt werden und die Leistung wirklich wichtig ist (so dass Sie Hunderte von Benutzern alle es zur gleichen Zeit ausgeführt wird, viele Male am Tag haben werden), dann könnten Sie über die Leistung Kosten der Unter Sorge -Schale. OTOH, wenn Sie es einmal im Monat und das Skript als Ganzes läuft laufen für unter 10 Sekunden, werden Sie wahrscheinlich nicht würde.

jedoch in Bezug auf Klarheit, ist es viel besser, explizit zu sein und die Variablen zu deklarieren - das Risiko des Skripts Bruches reduziert, weil jemand kommt und sagt: „diese Unterschal eindeutig nicht erforderlich sind“ (und es ist wirklich nicht;. I die Unterschalen von Ihren Funktionen zu entfernen, würde wollen)

Schauen Sie sich die Entwicklung von Perl-Skripten. Sie begann als ein free-for-all mit Variablen in Existenz auf Nachfrage kommen. Sie haben sich nach und nach strenger geworden, mit normalen Stil jetzt alle Variablen predeclare zu sein. Zu einem gewissen Grad haben Granaten einen ähnlichen Weg gefolgt - aber nicht so streng wie Perl. Awk ist auch eine interessante Fallstudie; Funktionen verwenden globale Variablen, wenn sie Argumente für die Funktion sind, die Leitungen zu Funktionen mit drei aktiven Argumente (sagen wir) geschrieben und 5 inaktive Argumente, die effektiv lokale Variablen definieren. Es ist leicht exzentrisch, obwohl es ‚funktioniert‘.

Andere Tipps

Nun, um sicherzustellen, dass alle Funktionen immer alle Variablen als lokale erklären, ist ziemlich schwierig.

Ich denke, das ist sehr fehleranfällig und bevorzugen immer Subshell-Funktionen verwenden:

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

Keine Notwendigkeit, lokale Variablen zu erklären - aber auch keine Möglichkeit, globale Variablen zu ändern. Was gut ist meiner Meinung nach!

Eine weitere Folge ist, dass Sie immer überprüfen müssen, um die Rückkehr / Exit-Code solcher Funktionen und entsprechend handeln! Das ist, weil du dich nicht verlassen kann Skript in einer Subshell Funktion!

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

f
echo "Did not exit"

Dies wird nicht das Skript beenden. Sie müssen es auf diese Weise tun:

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

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

Dies beendet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top