Ich versuche zum ersten Mal, eine Bash-Vervollständigung zu schreiben, und bin etwas verwirrt über die beiden Möglichkeiten, Bash-Arrays ( ${array[@]}
und ${array[*]}
) zu dereferenzieren .
Hier ist der relevante Codeabschnitt (er funktioniert übrigens, aber ich würde ihn gerne besser verstehen):
_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} ) )
}
In der Dokumentation von bash heißt es :
Auf jedes Element eines Arrays kann mit $ {name [tiefgestellt]} verwiesen werden. Die geschweiften Klammern sind erforderlich, um Konflikte mit den Dateinamenerweiterungsoperatoren der Shell zu vermeiden. Wenn der Index '@' oder '*' ist, wird das Wort auf alle Mitglieder des Array-Namens erweitert. Diese Indizes unterscheiden sich nur, wenn das Wort in doppelten Anführungszeichen steht. Wenn das Wort in doppelte Anführungszeichen gesetzt ist, wird $ {name [*]} zu einem einzelnen Wort erweitert, wobei der Wert jedes Array-Mitglieds durch das erste Zeichen der IFS-Variablen getrennt wird, und $ {name [@]} erweitert jedes Element des Namens zu einem separaten Wort.
Jetzt denke ich, dass ich verstehe, compgen -W
dass eine Zeichenfolge erwartet wird, die eine Wortliste möglicher Alternativen enthält, aber in diesem Zusammenhang verstehe ich nicht, was "$ {name [@]} jedes Element des Namens zu einem separaten Wort erweitert" bedeutet.
Lange Rede, kurzer Sinn: ${array[*]}
Werke; ${array[@]}
nicht. Ich würde gerne wissen warum und ich würde gerne besser verstehen, worauf es genau ${array[@]}
ankommt.