Definición de variable en bash usando la palabra clave local

33

Estoy aprendiendo scripts de bash y encontré esto en mi / usr / share / bash-complete, línea 305:

local cword words=()

¿Qué hace? Todos los tutoriales en línea son solo en el formato

local var=value
Alexandre Santos
fuente

Respuestas:

92

Aunque me gusta la respuesta dada por Jordan , creo que es igualmente importante mostrar a los Linuxusuarios menos experimentados cómo hacer frente a esas preguntas por sí mismos.

La forma sugerida es más rápida y versátil que buscar respuestas en páginas aleatorias que aparecen en la página de resultados de búsqueda de Google.

Primero, todos los comandos que se pueden ejecutar Bashsin escribir una ruta explícita, como ./commandse pueden dividir en dos categorías: Bash shell builtinsy external commands. Bash shell builtinsvienen instalados Bashy son parte de él mientras que external commandsno lo son Bash. Esto es importante porque Bash shell builtinsestán documentados en man bashsu interior y su documentación también se puede invocar con un helpcomando, mientras que external commandsgeneralmente se documentan por su cuenta manpageso toman algún tipo de -h, --helpbandera. Para verificar si un comando es un Bash shell builtino un external command:

$ type local
local is a shell builtin

Se mostrará how command would be interpreted if used as a command name(desde help type). Aquí podemos ver que locales un shell builtin. Veamos otro ejemplo:

$ type vim
vim is /usr/bin/vim

Aquí podemos ver que vimno es un shell builtinsino un comando externo ubicado en /usr/bin/vim. Sin embargo, a veces se puede instalar el mismo comando como external commandy shell builtinal mismo tiempo como a. Agregar -aa la typelista de todas las posibilidades, por ejemplo:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

Aquí podemos ver que echoes tanto a shell builtincomo a external command. Sin embargo, si usted acaba de escribir echoy pulsó Returnuna shell builtinque se llamaría ya que aparece por primera vez en esta lista. Tenga en cuenta que todas estas versiones de echono necesitan ser las mismas. Por ejemplo, en mi sistema /usr/bin/echotoma --helpbandera mientras builtinque a no.

Ok, ahora que sabemos que locales un shell incorporado, veamos cómo funciona:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

Nota la primera línea: name[=value]. Todo entre [y ]es opcional . Es una convención común utilizada en muchos manpagesy en forma de documentación en el *nixmundo. Dicho esto, el comando que preguntaste en tu pregunta es perfectamente legal. A su vez, el ...carácter significa que el argumento anterior puede repetirse. También puede leer sobre esta convención en algunas versiones de man man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

Entonces, al final del día, espero que ahora sea más fácil entender cómo funcionan los diferentes comandos Linux.

Arkadiusz Drabczyk
fuente
55
Muy buena respuesta. Lo estaba leyendo con la esperanza de que hablaras de cómo un principiante podría descubrir por sí mismo cuál era la asignación de la matriz, solo desde el código var=(), pero supongo que eso es un poco difícil de entender sin siquiera saber el nombre de lo que estás buscando. . ;)
Comodín el
¿Las cáscaras no bash localtambién son compatibles ?
palswim
2
Ingresé para poder votar
@Wildcard Dado que la matriz es una sintaxis bash en lugar de un comando, puede encontrarla definida en man bash. Una vez allí, escriba /Arrays$para saltar a la sección de matrices. (El arrastre $después Arrayses prevenir ciclismo a través de las referencias en el texto a la sección.) Desde allí se puede escribir fpara ir a la página siguiente o bpara retroceder. Escriba qpara salir de la página del manual cuando haya terminado.
Taylor Edmiston
Además, la ejecución helpsin args enumerará todos los componentes de bash si tiene curiosidad por ver más.
Taylor Edmiston
29

La localpalabra clave puede tomar múltiples variables. Proporcionar un valor a la variable es opcional. Su ejemplo declara dos variables, cwordy words. A la wordsvariable se le asigna una matriz vacía.

jordanm
fuente
18

localsimplemente declara que una variable tiene alcance solo en la función definida actualmente, de modo que el entorno de ejecución principal no puede "ver" el valor. No se puede usar localfuera de una función. Ejemplo

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

Salida: variable no local

Entonces $onlyhereno era visible fuera del alcance de la función.

Oteo
fuente
Esta respuesta tiene más sentido quién necesita una comprensión rápida.
Alex Raj Kaliamoorthy