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.
Eche un vistazo a la administración de Debian. Una introducción a la finalización de bash (es bastante fácil de entender), por cierto, también tiene una parte dos .
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
- Vía
complete -p
encontramoscomplete -o bashdefault -o default -o nospace -F _git git
. Recordamos "_git" para más tarde. - 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"