¿Cómo especificar un autocompletado personalizado para comandos específicos?

25

¿Hay alguna manera de que bash sepa exactamente qué mostrar cuando doble tabulación? Por ejemplo, tengo un script de Python scpyque requiere un par de argumentos. Por ejemplo apt-get, si tu doble pestaña te da

Autoclean build-dep clean dselect-upgrade purge source upgrade
quitar automáticamente verificar dist-upgrade instalar eliminar actualizar  

¿Hay alguna manera de hacer eso para sus propios scripts / programas? ¿Debo envolver mi script de Python en un script de bash?

Falmarri
fuente

Respuestas:

31

La forma más fácil de hacerlo es incluir un script de shell /etc/bash_completion.d/. La estructura básica de este archivo es una función simple que realiza la finalización y luego la invocación de la completecual es un bash incorporado. En lugar de entrar en detalles sobre cómo usarlo complete, le sugiero que lea Una introducción a la finalización de Bash . La Parte 1 cubre los conceptos básicos y la Parte 2 explica cómo escribiría un guión de finalización.

Puede encontrar una descripción más densa de la finalización de bash en la sección "Finalización programable" de man bash(puede escribir "/ Finalización programable" y luego presionar 'n' varias veces para llegar rápidamente. O, si tiene suerte, "g 2140 RETORNO ").

Steven D
fuente
8

Aquí hay una guía básica.

Tengamos un ejemplo de script llamado admin.sh en el que le gustaría tener el autocompletado funcionando.

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

Opción de nota lista corta. Al llamar al script con esta opción, se imprimirán todas las opciones posibles para este script.

Y aquí tienes el script de autocompletar:

_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

Tenga en cuenta que el último argumento para completar es el nombre del script al que desea agregar autocompletado. Todo lo que necesita hacer es agregar su secuencia de comandos de autocompletar a bashrc como

source /path/to/your/autocomplete.sh

o cópielo a /etc/bash.completion.d

Fuente: /ubuntu//a/483149/24155

Eduardo Cuomo
fuente
3
'tutorial completo' no es la frase que yo usaría para describir este ...
searchengine27