Почему есть && после некоторых определений функций в файле завершения bash?

Если вы посмотрите на файлы /usr/share/bash-completion/completions/* у многих есть определение функции, сопровождаемое && complete -F (по крайней мере, в Xenial). Почему это?

Имеет ли обозначение какое-то особое значение в файле завершения bash?

В bash я не вижу функциональной разницы между скриптами

a(){ echo in;return 1;} && a

а также

a(){ echo in;return 1;}; a

2 ответа

Решение

Справочник Bash рассказывает

Состояние выхода определения функции равно нулю, если только не произойдет синтаксическая ошибка или уже существует функция только для чтения с тем же именем. При выполнении состояние выхода функции является состоянием выхода последней команды, выполненной в теле.

Синтаксическая ошибка может прервать выполнение скрипта до complete -Fкоманда, поэтому команда, следующая за объявлением функции, не может быть выполнена в любом случае, но если функция только для чтения с тем же именем объявляется перед поиском файла, содержащего функцию, она может не прекратить выполнение. Чтобы предотвратить вызов неправильной функции завершения bash, используется такой логический тест AND.

complete является встроенной функцией bash, которая сообщает bash, как выполнять автозаполнение в различных ситуациях. Особенно, complete -F funcname cmdname сообщает bash, что если пользователь ввел команду cmdname, то завершение аргументов должно обрабатываться функцией funcname. использование help complete а также man bash для дополнительной информации. Многие установленные системой файлы автозаполнения устанавливают функции автозаполнения, используя шаблон

_cmd_name () {
  ... compute completions here and assign them to COMPREPLY ...
  return 0
} && complete -F _cmd_name cmd_name

Например,

_apt_get () {
  ... compute completions here and assign them to COMPREPLY ...
  return 0
} && complete -F _apt_get apt-get

который сообщает bash, что если у пользователя есть тип apt-get в качестве имени команды, то автозаполнение будет обрабатываться функцией _apt_get,

Это просто вопрос стиля кодирования, и этот стиль не уродлив или труден для понимания.

Другие вопросы по тегам