Domanda

Per quanto so che ci sono due modi per creare variabili locali in una funzione bash:. Creare una subshell o dichiarare ogni variabile come locale

Ad esempio:

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

o

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

Obvisously la versione utilizzando la subshell è più semplice da scrivere perché non c'è bisogno di preoccuparsi di dichiarare tutte le variabili locali (per non parlare (ambiente) variabili creato / esportato da strumenti come getopts ). Ma potevo immaginare che la creazione di una subshell ha un sovraccarico.

Allora, qual è l'approccio migliore? Quali sono i vantaggi / svantaggi?

È stato utile?

Soluzione

Creazione di una sotto-shell comporta una fork(), quindi sicuramente è in testa rispetto ad una variabile locale. Mentre sotto-gusci sono a buon mercato - si non preoccuparti per il loro costo, quando avete bisogno di uno - non sono liberi

.

Se lo script sta per essere molto utilizzato e le prestazioni che conta davvero (in modo da avere centinaia di utenti tutti che lo gestisce, allo stesso tempo, più volte al giorno), allora si potrebbe preoccuparsi del costo delle prestazioni del sub -conchiglia. OTOH, se si esegue una volta al mese e lo script nel suo complesso si estende per meno di 10 secondi, probabilmente non.

Tuttavia, in termini di chiarezza, è molto meglio essere espliciti e dichiarare le variabili - riduce il rischio di rottura del sceneggiatura perché qualcuno arriva e dice "questo sub-shell chiaramente non è necessaria" (ed è in realtà non è,. che vorrei rimuovere le sotto-gusci dalle vostre funzioni)

Guarda l'evoluzione di script Perl. Hanno cominciato come un free-for-all con le variabili che entrano in esistenza su richiesta. Essi sono progressivamente più rigorosa, con uno stile normale ora è quello di predichiarare tutte le variabili. In una certa misura, conchiglie hanno seguito un percorso simile - ma non nel modo più rigoroso Perl. Awk è anche un interessante caso di studio; sue funzioni utilizzano variabili globali se non sono argomenti della funzione, che porta a funzioni vengono scritti con 3 argomenti attivi (diciamo) e 5 argomenti inattivi che definiscono efficacemente variabili locali. E 'un po' eccentrico, anche se 'funziona'.

Altri suggerimenti

Ora, facendo in modo che tutte le funzioni dichiarano sempre tutte le variabili come locali, è abbastanza difficile.

Credo che questo sia molto soggetto ad errori e preferisco usare sempre subshell-funzioni:

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

Non c'è bisogno di dichiarare le variabili locali - ma anche un modo per cambiare le variabili globali. Che è buono, a mio parere!

Una conseguenza ulteriore è che è sempre necessario verificare il codice di ritorno / uscita di tali funzioni e agire di conseguenza! Questo è, perché non si può uscire di script all'interno di una funzione subshell!

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

f
echo "Did not exit"

Questa non uscirà lo script. È necessario fare in questo modo:

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

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

Questa uscirà

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top