Comment spécifier une saisie semi-automatique personnalisée pour des commandes spécifiques?

25

Existe-t-il un moyen pour que bash sache exactement quoi afficher lorsque vous double-tabulez? Par exemple, j'ai un script python scpyqui nécessite quelques arguments. Par exemple, comme apt-getsi vous double tabulation vous donne

autoclean build-dep clean dselect-upgrade purge source upgrade
autoremove vérifier dist-upgrade installer supprimer la mise à jour  

Existe-t-il un moyen de le faire pour vos propres scripts / programmes? Dois-je envelopper mon script python dans un script bash?

Falmarri
la source

Réponses:

31

La façon la plus simple de procéder consiste à inclure un script shell dans /etc/bash_completion.d/. La structure de base de ce fichier est une fonction simple qui effectue l'achèvement puis l'invocation de completece qui est une fonction intégrée bash. Plutôt que d'entrer dans les détails sur la façon de l'utiliser complete, je vous suggère de lire An Introduction to Bash Completion . La partie 1 couvre les bases et la partie 2 explique comment vous pourriez écrire un script d'achèvement.

Une description plus dense de l'achèvement de bash peut être trouvée dans la section "Achèvement programmable" de man bash(vous pouvez taper "/ Achèvement programmable" puis appuyer sur 'n' plusieurs fois pour y arriver rapidement. Ou, si vous avez de la chance, "g 2140 RETOUR ").

Steven D
la source
8

Voici un guide de base.

Permet d'avoir un exemple de script appelé admin.sh sur lequel vous souhaitez que la saisie semi-automatique fonctionne.

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

Notez la liste des options. L'appel de script avec cette option imprimera toutes les options possibles pour ce script.

Et ici, vous avez le script de saisie semi-automatique:

_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

Notez que le dernier argument à compléter est le nom du script auquel vous souhaitez ajouter la saisie semi-automatique. Tout ce que vous devez faire est d'ajouter votre script de saisie semi-automatique à bashrc en tant que

source /path/to/your/autocomplete.sh

ou copiez-le dans /etc/bash.completion.d

Source: /ubuntu//a/483149/24155

Eduardo Cuomo
la source
3
'tutoriel complet' n'est pas l'expression que j'utiliserais pour décrire cela ...
searchengine27