Jak określić niestandardowe autouzupełnianie dla określonych poleceń?

25

Czy istnieje sposób, aby bash dokładnie wiedział, co wyświetlić po podwójnym tabulowaniu? Na przykład mam skrypt w języku Python, scpyktóry wymaga kilku argumentów. Na przykład apt-get, jeśli podwójna karta daje

autoclean build-dep clean dselect-upgrade purge source upgrade upgrade
autorove sprawdź dist-upgrade zainstaluj usuń aktualizację  

Czy można to zrobić w przypadku własnych skryptów / programów? Czy muszę zawinąć skrypt Pythona w skrypt bash?

Falmarri
źródło

Odpowiedzi:

31

Najłatwiej to zrobić, włączając skrypt powłoki /etc/bash_completion.d/. Podstawowa struktura tego pliku to prosta funkcja, która wykonuje uzupełnienie, a następnie wywołanie completejest wbudowane w bash. Zamiast szczegółowo omawiać sposób korzystania complete, sugeruję przeczytanie An Introduction to Bash Completion . Część 1 obejmuje podstawy, a część 2 zawiera informacje na temat pisania scenariusza ukończenia.

Gęstszy opis ukończenia bash można znaleźć w sekcji „Programowalne zakończenie” man bash(możesz wpisać „/ Programowalne zakończenie”, a następnie nacisnąć kilka razy „n”, aby szybko się tam dostać. Lub, jeśli masz szczęście, „g 2140 POWRÓT ”).

Steven D.
źródło
8

Oto podstawowy przewodnik.

Załóżmy przykładowy skrypt o nazwie admin.sh, do którego chcesz, aby autouzupełnianie działało.

#!/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

Uwaga krótka lista opcji. Wywołanie skryptu z tą opcją spowoduje wydrukowanie wszystkich możliwych opcji dla tego skryptu.

A tutaj masz skrypt autouzupełniania:

_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

Zauważ, że ostatnim argumentem do uzupełnienia jest nazwa skryptu, do którego chcesz dodać autouzupełnianie. Wszystko, co musisz zrobić, to dodać swój skrypt autouzupełniania do bashrc as

source /path/to/your/autocomplete.sh

lub skopiuj go do /etc/bash.completion.d

Źródło: /ubuntu//a/483149/24155

Eduardo Cuomo
źródło
3
„kompletny samouczek” nie jest frazą, której użyłbym do opisania tego ...
searchengine27,