Ultimamente ho passato molto tempo nella shell e mi chiedo come funzioni il completamento automatico delle schede. Qual è il meccanismo dietro? Come fa la bash a conoscere il contenuto di ogni directory?
Ultimamente ho passato molto tempo nella shell e mi chiedo come funzioni il completamento automatico delle schede. Qual è il meccanismo dietro? Come fa la bash a conoscere il contenuto di ogni directory?
Risposte:
Ci sono due parti per il completamento automatico:
La libreria readline, come già menzionato da fixje, gestisce la modifica della riga di comando e richiama bash quando si preme tab, per abilitare il completamento. Bash quindi fornisce (vedi punto successivo) un elenco di possibili completamenti e readline inserisce tanti caratteri quanti sono identificati in modo univoco dai caratteri già digitati. (Puoi configurare abbastanza la libreria readline, vedi la sezione Modifica della riga di comando del Bash manuale per i dettagli.)
Bash stesso ha il built-in complete
per definire un meccanismo di completamento per i singoli comandi. Se per il comando corrente non viene definito nulla, viene utilizzato il completamento per nome file (utilizzando opendir / readdir, come ha detto Ignacio).
La parte per definire i propri completamenti è descritta nella sezione Completamento programmabile . In breve, con
complete «options» «command»
te definisci il completamento di qualche comando. Ad esempio, complete -u su
dice
quando si completa un argomento per il su
comando, cerca gli utenti del sistema corrente .
Se questo è più complicato di quanto le normali opzioni possono coprire (ad esempio completamenti diversi a seconda dell'indice dell'argomento, o in base agli argomenti precedenti), puoi usare -F function
, che quindi richiamerà una funzione di shell per generare l'elenco dei possibili completamenti. (Questo è usato ad esempio per il completamento di git, che è molto complicato, a seconda del sottocomando e talvolta delle opzioni fornite, ea volte usando nomi di rami (che non sono nulla di cui bash sa).
Puoi elencare i completamenti esistenti definiti nel tuo ambiente bash corrente usando semplicemente complete
, per avere un'impressione su ciò che è possibile. Se hai installato il pacchetto di completamento bash (o comunque è denominato sul tuo sistema), vengono installati i completamenti per molti comandi e, come ha detto Wrikken, /etc/bash_completion
contiene uno script bash che viene spesso eseguito all'avvio della shell per configurarlo. È possibile inserire ulteriori script di completamento personalizzati /etc/bash_completion.d
; quelli provengono tutti da /etc/bash_completion
.
/etc/bash_completion
(almeno, è lì che si trova gran parte della magia in Debian).