Atribuição variável indireta no bash
Parece que a maneira recomendada de fazer a configuração indireta de variáveis no bash é usareval
:
var=x; val=foo
eval $var=$val
echo $x # --> foo
O problema é o habitual comeval
:
var=x; val=1 (e como é recomendado em muitos lugares, pergunto-me quantos scripts estão vulneráveis por causa disso ...)
De qualquer forma, a solução óbvia de usar aspas (escapadas) não funciona realmente:
var=x; val=1\" O fato é que o bash possui referência variável indireta inserida (com${!foo}
), mas não vejo nenhuma maneira de executar tarefas indiretas - existe alguma maneira sensata de fazer isso?
Para o registro, eu encontrei uma solução, mas isso não é algo que eu consideraria "saudável" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd
eval $var=$val # bad output here
(e como é recomendado em muitos lugares, pergunto-me quantos scripts estão vulneráveis por causa disso ...)
De qualquer forma, a solução óbvia de usar aspas (escapadas) não funciona realmente:
var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\" # fail with the above
O fato é que o bash possui referência variável indireta inserida (com${!foo}
), mas não vejo nenhuma maneira de executar tarefas indiretas - existe alguma maneira sensata de fazer isso?
Para o registro, eu encontrei uma solução, mas isso não é algo que eu consideraria "saudável" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd\"
eval $var=\"$val\" # fail with the above
O fato é que o bash possui referência variável indireta inserida (com${!foo}
), mas não vejo nenhuma maneira de executar tarefas indiretas - existe alguma maneira sensata de fazer isso?
Para o registro, eu encontrei uma solução, mas isso não é algo que eu consideraria "saudável" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd
eval $var=$val # bad output here
(e como é recomendado em muitos lugares, pergunto-me quantos scripts estão vulneráveis por causa disso ...)
De qualquer forma, a solução óbvia de usar aspas (escapadas) não funciona realmente:
var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\" # fail with the above
O fato é que o bash possui referência variável indireta inserida (com${!foo}
), mas não vejo nenhuma maneira de executar tarefas indiretas - existe alguma maneira sensata de fazer isso?
Para o registro, eu encontrei uma solução, mas isso não é algo que eu consideraria "saudável" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"