Perché l'assegnazione della variabile locale ZSH non riesce?


3

Stavo leggendo questa domanda e risposta: zsh - l'assegnazione delle variabili non funziona . Il post spiega come risolverlo, ma non il perché. Perché l'assegnazione della variabile locale non riesce in quel caso?

Ci sono anche altri esempi di comportamenti simili come questo:

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}
}

Ciò si traduce nel seguente output:

a
a b
a

Se inserisco le virgolette intorno a 'x = "$ (echo" a b ")" in tutti i casi ottengo l'assegnazione della variabile corretta.

Se eseguo la stessa cosa in bash, ottengo 'ab' per tutte le funzioni.

Qualcuno può spiegare perché qui bash e zsh si comportano diversamente?

Risposte:


1

Se esegui lo script con -x(entrambi bashe zsh) vedrai che il codice $ (...) viene interpretato / analizzato in modo diverso. Questo perché, come indicato nelle FAQ , la divisione delle parole in zsh è incompatibile con le versioni precedenti / bash / sh.

Puoi usare SH_WORD_SPLITper affrontare questa differenza.

Ok, quindi non è un problema di suddivisione delle parole in quanto abbiamo una sostituzione di comando, citando nuovamente i documenti :

... Se la sostituzione non è racchiusa tra virgolette, l'output viene suddiviso in parole utilizzando il IFSparametro ...

Quindi la tua alternativa è di local IFS="": /


che sembra non funzionare: 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,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.