Estoy tomando una puñalada al escribir una finalización de Bash por primera vez, y estoy un poco confundido acerca de las dos formas de desreferenciar Bash arrays (${array[@]}
y ${array[*]}
).
Aquí está la porción relevante del código (que funciona, por cierto, pero me gustaría entenderlo mejor):
_switch()
{
local cur perls
local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew}
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
perls=($ROOT/perls/perl-*)
# remove all but the final part of the name
perls=(${perls[*]##*/})
COMPREPLY=($(compgen -W "${perls[*]} /usr/bin/perl" -- ${cur}))
}
de Bash documentation says:
Cualquier elemento de una matriz puede ser referenciado usando $ {name [subscript]}. Los refuerzos son necesarios para evitar conflictos con los operadores de expansión de nombre de archivo del intérprete de comandos. Si el subíndice es '@' o '*', la palabra se expande a todos los miembros del nombre de la matriz. Estos subíndices difieren solo cuando la palabra aparece entre comillas dobles. Si la palabra tiene comillas dobles, $ {nombre [*]} se expande a una sola palabra con el valor de cada miembro de la matriz separado por el primer carácter de la variable IFS, y $ {nombre [@]} expande cada elemento del nombre a una palabra separada.
Ahora creo que entiendo que compgen -W
espera una cadena que contiene una lista de palabras de alternativas posibles, pero en este contexto no entiendo lo que "$ {nombre [@]} expande cada elemento de nombre a una palabra separada "significa.
Cuento largo corto: ${array[*]}
funciona; ${array[@]}
no. Me gustaría saber por qué, y me gustaría entender mejor en qué se expande exactamente ${array[@]}
.
Esto es excelente; Gracias. Realmente me gustaría que explotara más fuerte, pero al menos aclara por qué no funcionó. – Telemachus