En Linux, mientras escribe un comando si presiona TAB dos veces, mostrará una lista de todos los comandos disponibles que comienzan con caracteres escritos.
Esto no es nada nuevo, probablemente ya lo sepas. Esta funcionalidad se denomina finalización de bash. La finalización básica del nombre del archivo y del directorio está disponible de forma predeterminada en la línea de comandos de bash.
Pero, podemos acelerar esta finalización de bash y llevarla al siguiente nivel usando el comando completo.
Este tutorial explica cómo podemos aplicar el autocompletado a las opciones y a los argumentos del comando usando el autocompletado programable.
Por ejemplo, después de escribir el comando de escritura, si presiona tabulador dos veces, el autocompletado proporciona una lista de usuarios para realizar escribir la operación.
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
En el siguiente ejemplo, mostraría los nombres de host disponibles para el comando telnet:
$ telnet [TAB][TAB] localhost dev-db fileserver
Para obtener la finalización programable en su terminal, solo necesita ejecutar /etc/bash_completion como se muestra a continuación,
# . /etc/bash_completion
También puede descomentar las siguientes líneas en /etc/bash.bashrc (desde ubuntu linux 13.04) para que no tenga que ejecutar el comando anterior explícitamente,
enable bash completion in interactive shells if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi
En caso de que no encuentre estas líneas y el archivo /etc/bash_completion, solo necesita instalar el paquete llamado bash_completion por apt-get
1. Ver finalización de bash existente
Después de habilitar la finalización de bash programable, se define un conjunto de finalización de bash. El comando complete se usa para definir la finalización de bash.
Para ver la finalización de bash existente, use el comando complete como se muestra a continuación.
complete -p | less
La opción -p es opcional en el ejemplo anterior.
2. Lista de finalización estándar en Bash
Bash proporciona la siguiente finalización estándar para los usuarios de Linux de forma predeterminada.
- Finalización de nombre de variable
- Finalizar nombre de usuario
- Finalización de nombre de host
- Finalizar nombre de ruta
- Finalizar nombre de archivo
Discutimos sobre esto en nuestro anterior artículo de finalización estándar de bash.
3. Definir finalización para obtener comandos
Defina una finalización con el comando -c para obtener la lista de comandos disponibles como argumento. En el siguiente ejemplo, la finalización se define para qué comando,
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
Como se vio arriba, al presionar 'y', todos los comandos aparecerán en la lista.
4. Definir finalización para obtener directorios
Con la opción d, la finalización se puede definir para obtener solo nombres de directorio como argumento. En el siguiente ejemplo, finalización definida para ls,
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
Como se vio arriba, al presionar tabulador solo se muestran los directorios.
5. Definir finalización para obtener nombres de trabajos en segundo plano
Con complete, también es posible obtener nombres de trabajo como argumento para los comandos. La opción j se usa para pasar nombres de trabajo como argumento al trabajo de comando como se muestra a continuación,
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
Hablando de trabajos en segundo plano, también debe saber cómo administrar trabajos en segundo plano de Linux usando estos ejemplos.
6. Finalización con Prefijo y Sufijo
Las terminaciones se pueden definir con el prefijo deseado que se agregará y el sufijo que se agregará con las terminaciones reales. En el siguiente ejemplo, el prefijo y el sufijo se definen para list_job_attrib.sh,
$ jobs [1]+ Stopped cat $ complete -P '">' -S '<"' ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] $ ./list_job_attrib.sh ">cat<"
7. Finalización de nombre de archivo y directorio con exclusión
Considere que el script completa su ejecución, la salida se escribió en un directorio de salida de la siguiente manera
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
En lo anterior, si necesita ignorar los archivos .tmp y .o para completar automáticamente con el comando ls,
$ export FIGNORE='.tmp:.o' $ complete -f -d ls $ cd output $ ls [TAB][TAB] all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
FIGNORE es la variable de shell que contiene el sufijo de los nombres de archivo y estos se excluyen en la finalización automática.
8. Dividir una cadena por IFS para obtener valores de finalización
La lista de palabras se puede mencionar con la opción -W y se divide con el valor en la variable IFS. Luego, cada palabra resultante se expande y se muestra para su finalización,
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
Como se indicó anteriormente, después de dividir la cadena por delimitador IFS, la palabra se expande, por lo que también es posible tener estas variables como se muestra a continuación,
$ echo $SORT_TYPE1 bubble $ echo $SORT_TYPE2 quick $ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
9. Escriba su propia función para generar finalización
Le permite incluir una función para definir la finalización. Con la opción -F, el nombre de la función se pasa al comando completo y se ejecuta para generar finalizaciones. Por ejemplo, las funciones se escriben como se muestra a continuación,
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
donde en la función anterior,
- COMPREPLY:la matriz contiene los resultados de finalización que se muestran después de presionar [TAB][TAB]
- COMP_WORDS:matriz de palabras que se escribe en la línea de comando
- COMP_CWORD:índice para la matriz COMP_WORDS y se puede acceder al uso de estas diferentes palabras de posición en la línea de comando.
- compgen:-W contiene las posibles finalizaciones y el argumento respectivo se elige en función de $current_arg
Esta función presente en el archivo parser_option se obtiene como se muestra a continuación,
$ source parser_option
Vincule esta función a su script de analizador como se muestra a continuación,
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
Como se vio anteriormente, las opciones para los analizadores se generan mediante la función _parser_options().
Nota:mire /etc/bash_completion para ver más funciones para la finalización programable.
10. Especificaciones secundarias cuando la primaria no genera ninguna
Si no hay coincidencias generadas por la especificación de finalización definida, entonces se toma la opción comp para la finalización mencionada con la opción -o.
$ complete -F _count_files -o dirnames ./countfiles.sh
Como arriba, la finalización se define con la función _count_files para el archivo ./countfiles.sh. Si la función _count_files() no genera ninguna coincidencia, se intenta completar el directorio.
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3