In Linux, mentre si digita un comando se si preme TAB due volte, vengono elencati tutti i comandi disponibili che iniziano con i caratteri digitati.
Non è una novità, probabilmente lo sai già. Questa funzionalità è chiamata completamento bash. Il completamento del nome del file e della directory di base è disponibile per impostazione predefinita nella riga di comando di bash.
Ma possiamo potenziare questo completamento bash e portarlo al livello successivo usando il comando completo.
Questo tutorial spiega come applicare il completamento automatico alle opzioni e agli argomenti del comando utilizzando il completamento programmabile.
Ad esempio, dopo aver digitato il comando di scrittura, se si preme tab due volte, il completamento automatico fornisce un elenco di utenti per eseguire scrivere l'operazione.
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
Nell'esempio seguente, mostrerebbe i nomi host disponibili per il comando telnet:
$ telnet [TAB][TAB] localhost dev-db fileserver
Per ottenere il completamento programmabile nel tuo terminale, devi solo eseguire /etc/bash_completion come mostrato di seguito,
# . /etc/bash_completion
Puoi anche decommentare le righe seguenti in /etc/bash.bashrc(da ubuntu linux 13.04) in modo da non dover eseguire esplicitamente il comando precedente,
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
Nel caso in cui non trovi queste righe e il file /etc/bash_completion, devi solo installare il pacchetto chiamato bash_completion di apt-get
1. Visualizza il completamento bash esistente
Dopo aver abilitato il completamento bash programmabile, sono definiti set di completamento bash. Il comando complete viene utilizzato per definire il completamento bash.
Per visualizzare il completamento bash esistente, usa il comando complete come mostrato di seguito.
complete -p | less
L'opzione -p è facoltativa nell'esempio precedente.
2. Elenco del completamento standard in Bash
Bash fornisce il seguente completamento standard per gli utenti Linux per impostazione predefinita.
- Completamento nome variabile
- Completamento nome utente
- Completamento nome host
- Completamento del percorso
- Completamento nome file
Ne abbiamo discusso nel nostro precedente articolo sul completamento dello standard bash.
3. Definisci il completamento per ottenere i comandi
Definisci un completamento con il comando -c per ottenere l'elenco dei comandi disponibili come argomento. Nell'esempio seguente, il completamento è definito per quale comando,
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
Come visto sopra, premendo 'y', verranno elencati tutti i comandi.
4. Definisci il completamento per ottenere le directory
Con l'opzione d, il completamento può essere definito per ottenere solo nomi di directory come argomento. Nell'esempio seguente, completamento definito per ls,
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
Come visto sopra, premendo tab ti vengono mostrate solo le directory.
5. Definisci il completamento per ottenere i nomi dei lavori in background
Con complete, è anche possibile ottenere i nomi dei lavori come argomento dei comandi. L'opzione j viene utilizzata per passare i nomi dei lavori come argomento al lavoro di comando come mostrato di seguito,
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
Parlando di lavori in background, dovresti anche sapere come gestire i lavori in background Linux usando questi esempi.
6. Completamento con prefisso e suffisso
I completamenti possono essere definiti con il prefisso desiderato da aggiungere e il suffisso da aggiungere ai completamenti effettivi. Nell'esempio seguente, il prefisso e il suffisso sono definiti per 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. Nome file e completamento directory con esclusione
Considera che lo script completa la sua esecuzione, l'output è stato scritto in una directory di output come segue
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
In quanto sopra, se è necessario ignorare i file .tmp e .o per il completamento automatico con il 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 è la variabile della shell che contiene il suffisso dei nomi dei file e quelli vengono esclusi nel completamento automatico.
8. Dividi una stringa per IFS per ottenere valori di completamento
La lista di parole può essere menzionata con l'opzione -W e viene divisa con il valore nella variabile IFS. Quindi ogni parola risultante viene espansa e viene visualizzata per il completamento,
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
Come indicato sopra, dopo aver diviso la stringa per il delimitatore IFS, la parola viene espansa, quindi è anche possibile averli come variabili come mostrato di seguito,
$ 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. Scrivi la tua funzione per generare il completamento
Consente di includere una funzione per definire il completamento. Con l'opzione -F, il nome della funzione viene passato per completare il comando e viene eseguito per generare i completamenti. Ad esempio, le funzioni sono scritte come mostrato di seguito,
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
dove nella funzione precedente,
- COMPLETA:l'array contiene i risultati di completamento che vengono visualizzati dopo aver premuto [TAB][TAB]
- COMP_WORDS:array di parole digitato sulla riga di comando
- COMP_CWORD:indice per l'array COMP_WORDS e utilizzando questa diversa posizione è possibile accedere alle parole sulla riga di comando.
- compgen :-W contiene i possibili completamenti e il rispettivo argomento viene scelto in base a $current_arg
Questa funzione presente nel file parser_option viene originata come mostrato di seguito,
$ source parser_option
Collega questa funzione al tuo script parser come mostrato di seguito,
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
Come visto sopra, le opzioni per i parser vengono generate dalla funzione _parser_options().
Nota:guarda /etc/bash_completion per visualizzare più funzioni per il completamento programmabile.
10. Specifiche secondarie quando la primaria non genera alcuna
Se non ci sono corrispondenze generate dalla specifica di completamento definita, l'opzione comp viene presa per il completamento menzionato con l'opzione -o.
$ complete -F _count_files -o dirnames ./countfiles.sh
Come sopra, il completamento è definito con la funzione _count_files per il file ./countfiles.sh. Se la funzione _count_files() non genera alcuna corrispondenza, viene tentato il completamento della directory.
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3