script que ejemplos ejecutar comandos comando bash shell tab-completion bash-completion

ejemplos - que es bash en linux



Accediendo a las terminaciones de bash para comandos específicos programáticamente (5)

Estoy tratando de escribir una pequeña aplicación de inicio de comandos, y me gustaría usar las finalizaciones de pestañas de Bash en mi propio sistema de finalización. He podido obtener una lista de terminaciones para comandos generales usando compgen -abck .
Sin embargo, también me gustaría obtener terminaciones para comandos específicos: por ejemplo, la entrada git p debería mostrar la finalización para los comandos de git.

¿Hay alguna manera de que pueda usar compgen para hacer esto? Si no es así, ¿hay otras formas en que pueda obtener una lista de completaciones programáticamente?

[EDITAR: Para aclarar, no estoy tratando de completar la ejecución de bash; mi aplicación es un iniciador de comandos GUI. Simplemente me gustaría usar las terminaciones existentes de bash en mi propia aplicación.]


Aquí un ejemplo simple pero de trabajo en bash:

function foo_completion() { local currentWord=${COMP_WORDS[COMP_CWORD]} local completionList="" case "${COMP_CWORD}" in "1") completionList="command1 command2 command3"; ;; "2") completionList="param1 param2 param3"; ;; esac COMPREPLY=( $( compgen -W "${completionList}" -- ${currentWord} ) ) } complete -F foo_completion foo

Con este tipo de código, obtendrá el comando N completado cuando escriba "foo c" + tab y paramN completado cuando escriba "foo command1 p" + tab

Puede calcular la lista de finalización desde la ayuda de comandos.

my2c


Compruebe en el directorio /etc/bash_completion.d/ . Aquí es donde permanecen los diferentes scripts de finalización de comando.



He pirateado este script hace un tiempo, lo que te da una terminación de Bash de página de hombre bastante precisa. Sé que otras personas han hecho cosas similares con el resultado de la opción de análisis - --help .


Realmente no sé cómo funciona, pero el increíble administrador de ventanas usa el siguiente código Lua para obtener acceso al resultado de la finalización de bash:

https://github.com/awesomeWM/awesome/blob/master/lib/awful/completion.lua#L119

  1. Vía complete -p encontramos complete -o bashdefault -o default -o nospace -F _git git . Recordamos "_git" para más tarde.
  2. La longitud de "git l" es 5, por lo que establecemos COMP_COUNT = 6. Estamos completando el primer argumento de "git", entonces COMP_CWORD = 1.

Todos juntos usamos el siguiente script:

__print_completions() { printf ''%s/n'' "${COMPREPLY[@]}" } # load bash-completion functions source /etc/bash_completion # load git''s completion function _completion_loader git COMP_WORDS=(git l) COMP_LINE=''git l'' COMP_POINT=6 COMP_CWORD=1 _git __print_completions

Salida: "log"