Come funziona il completamento automatico di Bash?


9

Posso capire che il completamento automatico di bash funziona per le utility standard. Ma come funziona il completamento automatico di programmi personalizzati come il caricatore Oracle SQL?

Nel comando seguente se si fa Tab dopo, control=si completa automaticamente con il nome del file di controllo:

sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log

Come fa a sapere che deve riempire il file di controllo in quel punto e non qualche altro file?


2
Il completamento dei parametri viene eseguito con le funzioni. La maggior parte di questi sono installati in /etc/bash_completion.d. Vedi anche /etc/bash_completione dai un'occhiata all'output di setquanto è cresciuto il tuo ambiente.
ott--

@ott Cosa dovrei cercare in quella posizione? Non riesco a vedere nulla di correlato a sqlldr. Tutto quello che ho è: gdbus-bash-completion.sh gvfs-bash-completion.sh pk-completion.bash yum.bash. L'output di setè altrettanto poco interessante.
Kshitiz Sharma,

Potrebbe anche essere fatto in alcuni script di /etc/profile.d. O forse il tuo .bash_profileo è .bashrcstato modificato.
ott--

In che modo queste funzioni sono diverse dalle normali funzioni. E come ho fatto a definire il mio per fornire il completamento automatico per uno script personalizzato? Potresti indicare nella giusta direzione?
Kshitiz Sharma,

1
@KshitizSharma, bash-completioncarica i completamenti in modo dinamico da allora 1.90. Prova: sqlldr<space><tab><enter>. Quindi digitare complete -p sqlldr.
Evgeny Vereshchagin,

Risposte:


6

Il completamento programmabile di Bash funziona analizzando la riga di comando e scoprendo cosa viene completato:

  1. Alcuni contesti vengono trattati in modo speciale, ad esempio la prima parola in un comando viene completata come nome di comando, ciò che segue a $viene completato come nome di variabile, ecc.
  2. Al di fuori di questi contesti, bash tenta di completare l'argomento di un comando e vengono applicate le impostazioni per il comando o, in caso contrario, ciò (che è solitamente il caso) per il nome di base del comando.

Ad esempio, dopo , bash completa i nomi dei comandi che iniziano con . Successivamente , bash completa i nomi delle variabili che iniziano con . Successivamente , bash applica le regole di completamento per il comando . Le regole di completamento possono specificare una categoria (utente, variabile, file, ecc.), Un modello jolly per i nomi dei file o una funzione o frammento di codice da eseguire.sqllTabsqllsqlldr $aTabasqlldr Tabsqlldr

Le regole di completamento sono definite dall'integrato complete. Bash non tiene traccia di quando è completestato chiamato il builtin o dello script (se presente) in cui si trovava. La maggior parte delle distribuzioni fornisce il pacchetto bash-completamento , che fornisce una serie di regole per i comandi più comuni. Questo prende la forma di una serie di file di script che contengono chiamate a complete, con uno script che deve essere letto .bashrc(o /etc/bash.bashrcse implementato) per caricare tutti questi script: in genere . /etc/bash_completionè necessario per attivare il completamento programmabile e caricare gli script disponibili.

Il pacchetto standard non include il supporto per sqlldr. Se si dispone di tale supporto, deve provenire da una fonte diversa. Questa fonte potrebbe aver lasciato cadere un file in una directory come /etc/bash_completion.do potrebbe essere arrivato con le istruzioni per includere del codice nel tuo .bashrc. Puoi usare complete -p sqlldrper vedere le regole attuali per sqlldr; come accennato in precedenza, questo non ti dirà da dove sono state caricate quelle regole.

Tcsh, zsh e fish hanno meccanismi in qualche modo simili (tutti hanno tratto ispirazione da tcsh) ma diversi builtin, sintassi e capacità.


sì, non puoi individuare dove è completestato chiamato. Ma puoi trovare il nome del file di origine e il numero di riga in cui è definita la funzione di completamento. complete -p sudo # outputs complete -F _sudo sudo, shopt -s extdebug, declare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo. (Ma vedi il mio commento sul caricamento dinamico dei completamenti e complete -p).
Evgeny Vereshchagin,

and the settings for the basename of the command are applied. No. Puoi avere un compspecs diverso per datee /bin/date. Il riferimento dice : Se la parola di comando è un percorso completo, viene prima cercata una compspec per il percorso completo. Se non viene trovato nessun compspec per il percorso completo, viene effettuato un tentativo di trovare un compspec per la porzione successiva alla barra finale
Evgeny Vereshchagin
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.