it-swarm-es.tech

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

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

 autoclean build-dep clean dselect-upgrade purge source upgrade 
 autoremove check dist-upgrade install remove update 

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

28
Falmarri

La forma más fácil de hacerlo es incluir un script de Shell en /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 complete, que es un bash incorporado. En lugar de entrar en detalles sobre cómo usar complete, le sugiero que lea 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.

Se 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 RETURN").

32
Steven D

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. Llamar al script con esta opción imprimirá 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 el 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: https://askubuntu.com/a/483149/24155

9
Eduardo Cuomo