Para preceder elementos a um array, você pode simplesmente fazer:
a[1,0]=(more elements)
Ou você pode fazer:
a=(more elements "$a[@]")
Observe que fazendo:
a=(more elements $a)
removeria os elementos vazios em $a .
Agora, para criar uma função para isso, é para isso que o eval serve, mas você precisa ter a sintaxe correta:
prepend() {
eval "${1}[1,0]"='("${@[2,-1]}")'
}
Veja como o ("${@[2,-1]}") está entre aspas simples, por isso é passado literalmente para eval .
Ou o caminho mais longo, mas não funcionaria para prepend var more elements (quando o nome da variável for var ):
prepend() {
local var=$1; shift
eval "$var"='("$@" "${'"$var"'[@]}")'
}
O código que você deseja eval avalia sobre prepend varname ... é:
varname=("$@" "${varname[@]")
Você não deseja que "$@" seja expandido antes de ser passado para eval . Somente $var precisa ser expandido para lá.
Observe que o sinalizador de expansão da variável P é tão perigoso quanto eval quando usado com dados não-analisados.
var='x[$(uname>&2)0]'
echo "${(P)var}"
Será executado o comando uname .