Завершение Bash после равенства не работает в Ubuntu

На моем компьютере с Ubuntu 14.04.3 с включенным завершением bash (через . /etc/bash_completion в ~/.bashrc) я не получаю завершение содержимого каталога для cmd --param=<TAB>, т. е. при нажатии ничего не происходит. Когда я запускаю чистый bash (например, через env -i bash --norc), он работает, как и ожидалось, но тогда программируемое завершение недоступно. Я нашел дополнение Bash для пути в аргументе (со знаком равенства присутствует), в котором говорится о похожей проблеме, но 1) соответствующий скрипт npm не существует на моей машине и 2) даже удаление всех файлов из /etc/bash_completion.d не решает проблему. Что я могу сделать, чтобы получить надлежащее завершение?

Я нашел одно нерешительное исправление, запустив complete -r -D, которое не позволяет bash выполнять новые команды. Это снова включает завершение после равенства, но останавливает завершение, например, для killall.


person tlangner    schedule 14.08.2015    source источник
comment
Включает ли $COMP_WORDBREAKS =? Если нет, попробуйте COMP_WORDBREAKS+== и посмотрите, соответствует ли завершение ожидаемому результату.   -  person rici    schedule 14.08.2015
comment
Содержимое $COMP_WORDBREAKS: "'><=;|&(:. Удаление или добавление =, похоже, не меняет поведение по отношению к нему. завершение после =, к сожалению.   -  person tlangner    schedule 17.08.2015
comment
Запустите complete -p cmd и посмотрите, определена ли спецификация для вашего cmd.   -  person pynexj    schedule 17.08.2015
comment
Нет, конкретная спецификация не определена, она не выполняется должным образом ни для одной команды (последний раз, когда я использовал ljkasdfjler --asdlk=<TAB>;))   -  person tlangner    schedule 18.08.2015


Ответы (1)


Хотя я не понимаю, что вы подразумеваете под «остановкой завершения после killall», я считаю, что есть обходной путь.

Я нашел его здесь. Это включает в себя переопределение сломанной функции завершения bash. Копипаст сюда для записи. Обходной путь заключается в том, чтобы добавить в .bashrc следующее:

_completion_loader () {
  local dir=/usr/share/bash-completion/completions
  local cmd="${1##*/}"
  . "${dir}/${cmd}" &>/dev/null && return 124
  complete -o default -o bashdefault "${cmd}" &>/dev/null && return 124
}

Я не уверен, исправлена ​​ли фактическая ошибка в bash: комментарии в отчет об ошибке неясен и упоминает еще пару проблем. Для справки, мой bash — это версия 4.2.46 (1) (Redhat EL 7), в которой есть эта ошибка.

person ST0    schedule 19.11.2015