Предотвращение завершения bash из печати ответа дважды

Эта ошибка может быть вызвана неконтролируемыми требованиями к Java-версии.

В моем случае я смог разрешить эту ошибку, создав высокопрофильный проект с открытым исходным кодом, переключившись с Java 9 на Java 8 используя SDKMAN! .

sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu

Затем выполните чистую установку, как описано ниже.


При использовании Maven в качестве инструмента построения иногда полезно - и, как правило, приятно, сделать clean сборку установки с отключенным тестированием.

mvn clean install -DskipTests

Теперь, когда все построенный и установленный, вы можете продолжить и запустить тесты.

mvn test

1
задан DannyB 13 July 2018 в 12:21
поделиться

1 ответ

В этот момент проверьте значение COMP_LINE:

$ asd one <TAB>

Вы заметите, что это значение:

declare -x COMP_LINE="asd one "

. Это приведет к двум позиционным параметрам после того, как вы выдадите set, и ваше состояние не будет вызвано. Попробуйте ввести дополнительный символ: $ asd one o<TAB>, и вы увидите, что ваше условие будет запущено правильно, и ничего не будет завершено.


Большинство завершений, которые я видел, были выполнены с использованием функции. Фактически, проверка всех завершений, определенных в моей системе сейчас (большинство из них по умолчанию), ни один из них не выполняется с использованием сценария.

Использование функции имеет некоторые преимущества, например массив 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
1
ответ дан PesaThe 17 August 2018 в 12:55
поделиться
  • 1
    Спасибо за этот ответ, это помогает. Но после попытки изменить свой код, чтобы использовать функцию вместо этого, я понял, что я действительно предпочитаю использовать версию скрипта, одной из причин является желание остаться с одним скриптом (который нужно выполнить). Если я иду по маршруту функций, я должен предоставить второй скрипт пользователям, чтобы они могли его исправить, а не выполнять. По крайней мере, это мое понимание. (и последняя часть ответа не работает). – DannyB 13 July 2018 в 20:23
  • 2
    @DannyB Какую версию bash вы используете? Предыдущие версии bash имели проблемы с -1. Вместо этого вы можете попробовать ${COMP_LINE:${#COMP_LINE}-1}. Ну, функция / сценарий зависит от вас, чтобы решить. Некоторый глобальный скрипт завершения, который будет получать источники, звучит хорошо, учитывая преимущества. – PesaThe 13 July 2018 в 20:33
Другие вопросы по тегам:

Похожие вопросы: