SO : Ubuntu 16.04.3
Shell : Bash 4.3.48
Sé que es posible cambiar temporalmente el contenido de una variable como en var=value command
, siendo probablemente IFS= read -r var
el caso más notable de esto.
Y, gracias a la wiki de Greg , también entiendo:
# Why this
foo() { echo "$var"; }
var=value foo
# And this does work
var=value; echo "$var"
# But this doesn't
var=value echo "$var"
Lo que se me escapa es esto:
$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
Hasta donde yo sé (y siguiendo la lógica de los ejemplos anteriores), debería imprimir bar
, no (bar baz)
.
¿Esto solo me pasa a mí? ¿Es este el comportamiento previsto y me falta algo? ¿O es esto un error?
export var=(foo bar); echo "${var[0]}"
imprimefoo
, no(foo bar)
.export
muestra:declare -ax var=([0]="foo" [1]="bar")
export i_am_array=(foo bar); /usr/bin/env | grep i_am_array
no da salida aquí.foo() { declare -p var; } ; var=(bar baz) foo
dadeclare -x var="(bar baz)"
lo que confirma su ser tratada como una cadena, no una matrizRespuestas:
Generalmente llamando:
donde
cmd
es una función no es portátil.Con
bash
, eso solo funciona para variables escalares (y conx=(...)
analizado como una matriz pero asignado como escalar) y hay una serie de problemas con el alcance si lo hace, conksh93
yyash
, funciona, pero la definición de la variable permanece después. Conmksh
, obtienes un error de sintaxis. En el shell Bourne, no funcionó en absoluto, incluso para las variables escalares.También tenga en cuenta que incluso con variables escalares, si la variable termina siendo exportada dentro de la función (es decir, se pasa a los comandos que se ejecutan) varía de shell a shell (está en bash, yash, mksh, zsh, pero no en ksh, ceniza).
Solo funciona de la manera que esperarías
zsh
. Tenga en cuenta que loszsh
índices de matriz comienzan en 1.fuente
No es solo un error, parece ser una característica no implementada sin planes de serlo. Esta publicación de la lista de correo de 2014 tiene esto del creador:
Aprovechando el último repositorio de git para Bash tiene esto en
variables.c
:Sugiriendo que lo que sea que esté allí no está completo.
fuente
execve()
llamadas al sistema involucradas. Busquezsh
un shell que admita funciones de llamada con una matriz configurada temporalmente de esa manera.my_var=one func_bar
. ¿Podemos decir que seexport
está agregando al medio ambiente y, por lo tanto, la exportación se utiliza aquí, bajo el capó? Mira mi respuesta, agregué el código de demostración.Desde la
man bash
sección de ERRORES (la versión de labash
es 4.3):El siguiente código demuestra que existe una variable temporal en el entorno, solo mientras la función se está ejecutando. Cuando se completa la función, la variable temporal desaparece.
Información relacionada:
VAR=VALUE some-command
construcción.fuente