В этот момент проверьте значение COMP_LINE
:
$ asd one
Вы заметите, что это значение:
declare -x COMP_LINE="asd one "
. Это приведет к двум позиционным параметрам после того, как вы выдадите set
, и ваше состояние не будет вызвано. Попробуйте ввести дополнительный символ: $ asd one o
, и вы увидите, что ваше условие будет запущено правильно, и ничего не будет завершено.
Большинство завершений, которые я видел, были выполнены с использованием функции. Фактически, проверка всех завершений, определенных в моей системе сейчас (большинство из них по умолчанию), ни один из них не выполняется с использованием сценария.
Использование функции имеет некоторые преимущества, например массив COMP_WORDS
, который учитывает кавычки. Ваш скрипт можно было бы переписать примерно так:
_asd_comp() {
(( COMP_CWORD > 1 )) && return
local cur=${COMP_WORDS[COMP_CWORD]} IFS=$' \t\n'
COMPREPLY=( $(compgen -W "one two three" -- "$cur") )
}
complete -o bashdefault -o default -F _asd_comp asd
Я добавил параметры -o
, чтобы по умолчанию выполнялись после первого аргумента. Вы можете узнать больше об этом в руководстве .
Единственное, что приходит на ум в том, как изменить ваш скрипт, я думаю, вы могли бы добавить довольно нечистое состояние, таких как:
(( $# > 1 )) && [[ ${COMP_LINE: -1} = " " ]] && return
В результате вашего «непристойного количества скобок» вы в итоге получили недействительный
Sum(...count(...)...)
, который будет агрегацией агрегации, в то время как вы, вероятно, ищете для чего-то вроде
Sum(...)/count(...)
Не имеющего непосредственного отношения к вашей текущей проблеме, но, кроме того, если s.home
не является вашим первичным ключом, вы можете либо получить неверные результаты, либо сообщение об ошибке , поскольку s.kickoff
и s.away
не являются частью вашего group by
. И, как уже упоминалось в @Strawberry, вам следует серьезно подумать о редизайне ITACornerNew
.