bash
avalia a seguinte expressão sem qualquer objeção:
declare -A SPANISH=( [rojo]=red [verde]=green [azul]=blue )
...mas não gosta nem um pouco disso:
declare -A SPANISH=( $( echo "[rojo]=red [verde]=green [azul]=blue" ) )
bash: SPANISH: $( echo "[rojo]=red [verde]=green [azul]=blue" ): must use subscript when assigning associative array
Eu tentei muitas variações, mas o resultado é sempre uma ou mais instâncias do must use subscript when assigning associative array
erro mostrado acima.
Este exemplo é bobo, claro. Seu único propósito é ilustrar o problema de inicializar um array associativo bash usando uma substituição de comando .
Isso pode ser feito?
Para ser concreto, e continuar com o exemplo bobo acima, o que seria um comando <COMMAND>
tal que
declare -A SPANISH=( $( <COMMAND> ) )
...produz o mesmo resultado final que o produzido por
declare -A SPANISH=( [rojo]=red [verde]=green [azul]=blue )
acima?
Aliás, zsh
lida com esta situação sem nenhum problema:
$ declare -A SPANISH=( $( echo "rojo red verde green azul blue" ) )
$ echo "${SPANISH[azul]}"
blue
Ou:
Ou:
Para isso importa,
Trabalhe para mim com o bash 5.1, embora você também possa usar
eval
, pois é essencialmente o que está acontecendo aqui, o bash acaba interpretando a saída do comando como código.Por exemplo, com
Seria executado
reboot
da mesma forma que:O uso
eval
explícito deixaria mais claro que há um caminho para uma vulnerabilidade de injeção de comando e é mais provável que seja à prova de futuro, caso o design confuso seja corrigido no futuro.Para uma abordagem mais segura, você pode obter
cmd
chaves e valores delimitados por NUL (já que as variáveis bash não podem conter NULs de qualquer maneira) e preencher sua matriz associativa em um loop, com a ressalva usual adicional de que as matrizes associativas no bash não podem t tem elementos com uma chave vazia.