Come funziona il completamento della scheda bash?


113

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?


2
Potresti voler controllare /etc/bash_completion(almeno, è lì che si trova gran parte della magia in Debian).
Wrikken

1
@Wrikken: Questo è bash_completion, che dipende dal completamento con tabulazione ma non proprio come accade.
Ignacio Vazquez-Abrams

Risposte:


100

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 completeper 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 sudice quando si completa un argomento per il sucomando, 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_completioncontiene 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.


1
Le pagine man sono lì solo per comandi indipendenti, non per i builtin della shell. Ma fa parte del manuale di bash che ho collegato.
Paŭlo Ebermann

7

Se sei interessato alle basi: Bash usa readline che presenta la cronologia e il completamento di base. Puoi ispezionare la fonte se vuoi ottenere una comprensione dettagliata. Inoltre, puoi utilizzare readline per creare le tue interfacce CLI con il completamento

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.