Как указать пользовательское автозаполнение для конкретных команд?

25

Есть ли способ, чтобы bash точно знал, что отображать при двойном нажатии? Например, у меня есть сценарий Python, scpyкоторый требует пару аргументов. Например, как apt-get, если вы двойной вкладкой дает вам

autoclean build-dep clean dselect-upgrade обновление источника очистки
автоматическое удаление проверка dist-upgrade установка удалить обновление  

Есть ли способ сделать это для ваших собственных скриптов / программ? Нужно ли мне оборачивать свой скрипт на python в скрипт bash?

Falmarri
источник

Ответы:

31

Самый простой способ сделать это - включить скрипт в /etc/bash_completion.d/. Базовая структура этого файла представляет собой простую функцию, которая выполняет завершение, а затем completeвызывает ее, встроенную в bash. Вместо того, чтобы вдаваться в подробности о том, как использовать complete, я предлагаю вам прочитать Введение в Bash Completion . Часть 1 охватывает основы, а часть 2 рассказывает, как вы будете писать сценарий завершения.

Более плотное описание завершения bash можно найти в разделе «Программируемое завершение» man bash(вы можете ввести «/ Программируемое завершение» и затем несколько раз нажать «n», чтобы быстро туда добраться. Или, если вам повезет, «g 2140 ВОЗВРАТ ").

Стивен Д
источник
8

Вот основное руководство.

Давайте рассмотрим пример скрипта с именем admin.sh, к которому вы бы хотели, чтобы работало автозаполнение.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

Примечание вариант списка. Вызов скрипта с этой опцией распечатает все возможные опции для этого скрипта.

И вот у вас есть скрипт автозаполнения:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur prev
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

Обратите внимание, что последний аргумент для завершения - это имя скрипта, к которому вы хотите добавить автозаполнение. Все, что вам нужно сделать, это добавить свой скрипт автозаполнения в bashrc как

source /path/to/your/autocomplete.sh

или скопируйте его в /etc/bash.completion.d

Источник: /ubuntu//a/483149/24155

Эдуардо Куомо
источник
3
«полное руководство» - это не та фраза, которую я бы использовал, чтобы описать это ...
searchengine27