¿Por qué falla la asignación de variables locales de ZSH?

3

Estaba leyendo esta pregunta y respuesta: zsh - la asignación de variables no está funcionando . La publicación explica cómo solucionarlo, pero no por qué. ¿Por qué falla la asignación de variables locales en ese caso?

También hay algunos otros ejemplos de comportamiento similar como este:

myfun()
{
local x=$(echo "a b"); echo ${x} 
}

myfun2()
{
local x 
x=$(echo "a b")
echo ${x}
}

myfun3()
{
local x=$(echo "a b")
echo ${x}
}

Esto resulta en el siguiente resultado:

a
a b
a

Si pongo comillas alrededor de 'x = "$ (echo" a b ")" en todos los casos, obtengo la asignación de variable correcta.

Si ejecuto lo mismo en bash, obtengo 'a b' para todas las funciones.

¿Puede alguien explicar por qué bash y zsh están actuando de manera diferente aquí?

theooze
fuente

Respuestas:

1

Si ejecuta su script con -x (ambos bash y zsh ) verá que el código $ (...) se interpreta / analiza de manera diferente. Esto es porque, como indicado en la FAQ , la división de palabras en zsh es al revés / bash / sh incompatible.

Puedes usar SH_WORD_SPLIT para hacer frente a esta diferencia.

Ok, entonces no es un problema de división de palabras ya que tenemos una sustitución de comando, citando los docs otra vez:

... Si la sustitución no está entre comillas dobles, la salida se divide en palabras usando la IFS parámetro...

Así que tu alternativa es local IFS="" : /

Felipe Lema
fuente
eso no parece funcionar zsh -x test.sh +test.sh:1> setopt shwordsplit +test.sh:21> myfun +myfun:2> echo 'a b' +myfun:2> local 'x=a' b +myfun:2> echo a
theooze