Sto provando a scrivere uno script di completamento Bash per i comandi che possono richiedere opzioni lunghe nel modulo --option
o --param=value
. Se l'utente ha già inserito un'opzione sulla riga di comando, tale opzione deve essere esclusa dalla lista di completamento (assumendo che abbia senso solo specificare una determinata opzione una volta sulla riga di comando).Opzioni di comando complete con segno di uguale
Ecco un primo tentativo:
_myprog()
{
local cur="${COMP_WORDS[$COMP_CWORD]}"
local words=(--help --param1= --param-state --param2=)
_exclude_cmd_line_opts
COMPREPLY=($(compgen -W "${words[*]}" -- "$cur"))
}
complete -F _myprog myprog
_exclude_cmd_line_opts() {
local len=$(($COMP_CWORD - 1))
local i
for i in "${COMP_WORDS[@]:1:$len}" ; do
[[ $i == --* ]] && words=("${words[@]/$i}")
done
}
Se sorgente di questo script source script.sh
e poi scrivere:
$ myprog --param1= <tab><tab>
ottengo il seguente elenco di completamento:
= --help --param2= --param-state
così funziona quasi tranne che ottengo un segno spuria '='
nel completamento lis t .. Qualche suggerimento?
Modifica '--param1 =' a '--param1' nell'assegnazione' local words'. – Barmar
Sì, funziona, ma vorrei evitare che l'utente digiti il segno '=' se possibile .. –
Oh, stai parlando di '=' all'inizio, non di '=' dopo '--param2 '. Non l'ho visto prima. – Barmar