Pregunta

Por lo que yo sé que hay dos maneras de crear variables locales en una función de bash:. Crear un subnivel o declarar todas las variables como locales

Por ejemplo:

# 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 versión con el subnivel es más fácil de escribir porque usted no tiene que preocuparse acerca de declarar todas las variables locales (por no mencionar (medio ambiente) las variables creada / exportado por herramientas como getopts ). Pero podría imaginar que la creación de un subnivel tiene una sobrecarga.

Entonces, ¿cuál es el mejor enfoque? ¿Cuáles son los pros / contras?

¿Fue útil?

Solución

Creación de un sub-shell implica una fork(), por lo que sin duda ha comparado de arriba con una variable local. Mientras sub-conchas son baratos - que no se preocupe por su costo cuando lo necesite - no son libres

.

Si su script va a ser muy utilizados y el rendimiento que realmente importa (lo que tendrá que cientos de usuarios que ejecutan todos los que, al mismo tiempo, muchas veces al día), entonces puede que preocuparse por el costo de rendimiento de la sub -cáscara. Otoh, si se ejecuta una vez al mes y la secuencia de comandos se ejecuta como un todo por menos de 10 segundos, es probable que no.

Sin embargo, en términos de claridad, es mucho mejor ser explícita y declarar las variables - que reduce el riesgo de rotura del guión porque alguien viene y dice "este sub-shell claramente no es necesaria" (y se realmente no lo es;. me quiero retirar los sub-proyectiles de sus funciones)

Mire la evolución de scripts de Perl. Empezaron como un país libre para todos con las variables de venir a la existencia de la demanda. Ellos han vuelto cada vez más rigurosa, con el estilo normal, siendo ahora a predeclarar todas las variables. Hasta cierto punto, conchas han seguido un camino similar - pero no tan rigurosamente como Perl. Awk es también un interesante caso de estudio; sus funciones utilizan variables globales a menos que sean argumentos de la función, lo que conduce a las funciones que se escriben con 3 argumentos activos (por ejemplo) y 5 argumentos inactivos que definen efectivamente las variables locales. Es un poco excéntrico, aunque 'obras'.

Otros consejos

Ahora, asegurándose de que todas las funciones siempre se declaran todas las variables como locales, es bastante difícil.

Creo que esto es muy propenso a errores y prefiero usar siempre subshell-funciones:

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

No hay necesidad de declarar variables locales - pero también hay manera de cambiar las variables globales. Lo cual es bueno en mi opinión!

Una consecuencia adicional es que siempre hay que comprobar el código de retorno / salida de tales funciones y actuar en consecuencia! Esto es, porque no se puede salir de la escritura dentro de una función subnivel!

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

f
echo "Did not exit"

Esto no va a salir de su guión. Usted necesidad de hacerlo de esta manera:

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

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

Esto salir

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top