Posto standard per gli script bash_completion.d definiti dall'utente?


47

Ho accesso utente (no root) in una macchina Linux (Suse) dove ho sviluppato alcuni script bash e le corrispondenti regole di completamento automatico bash.

Dato che gli script appartengono solo al mio utente e quindi ho bisogno che le regole complete siano "attive" solo per me (una parte del fatto che non ho accesso di scrittura root), posizionare il mio script bash_completion nella /etc/bash_completion.d/cartella non è un'opzione.

Al momento ho chiamato il mio file .bash_completion.myscripte lo ho estratto direttamente dal mio .bashrc, ma mi chiedo solo se esiste un altro modo "standard" per ottenere questi risultati, già considerato nell'implementazione di bash.

Ad esempio, creando una cartella /home/myuser/.bash_completion.d/?

Risposte:


36

Usa un ~/.bash_completionfile.

Dalle domande frequenti sul completamento di Bash :

D. Come posso inserire i miei completamenti locali senza doverli
reinserire ogni volta che emetti una nuova versione?

A. Inseriscili in ~ / .bash_completion, che viene analizzato alla fine dello
script di completamento principale. Vedi anche la prossima domanda.

D. Autorizzo / mantengo il pacchetto X e vorrei mantenere il mio
codice di completamento per questo pacchetto. Dove dovrei metterlo per essere sicuro
che le shell bash interattive lo troveranno e lo troveranno?

A. Installalo in una delle directory indicate dalle
variabili del file pkgconfig di bash-completamento. Esistono due
alternative: quella consigliata è 'completionsdir' (ottenerlo con
"pkg-config --variable = completionsdir bash-completamento") da cui i
completamenti vengono caricati su richiesta in base ai nomi dei comandi richiamati,
quindi assicurati di nominare il tuo file di completamento di conseguenza e includere
ad esempio collegamenti simbolici nel caso in cui il file fornisca completamenti
per più di un comando. L'altro che è presente per
motivi di compatibilità all'indietro è 'compatdir' (ottenerlo con
"pkg-config --variable = compatdir bash-completamento"


Ho cercato su Google e cercato molto all'interno di serverfault prima di chiedere, ma non ho pensato al passaggio più semplice: RTFM! Mille grazie per la risposta!
Carles Sala,

4
Potrebbe voler specificare che .bash_completionè un file e non una directory. Dato che bash_completion.dè una directory che supponevo di poter semplicemente scplocalizzare bash_completion.de rinominare sul server remoto, ma al successivo accesso mi ha detto che doveva essere un file.
NobleUplift,

3
Le domande frequenti sul completamento di Bash di @NobleUplift sono state modificate e ora contengono informazioni su come caricare i completamenti di Bash dell'utente da una directory su richiesta. Questo sembra funzionare almeno con la versione 2.8 di bash-completamento, ma non con la 2.1. I file nella directory dovrebbero essere nominati esattamente come il comando a cui sono destinati, oppure i collegamenti simbolici potrebbero essere usati a tale scopo.
Jarno

@jarno Ho codificato gli script di completamento bash per tutti i programmi personalizzati e gli script nel nostro sistema, ma i miei sviluppatori senior li hanno abbattuti :(
NobleUplift

@NobleUplift perché? Puoi usarli comunque per te stesso.
jarno,

49

Ecco come un utente locale può avere una ~/.bash_completion.d/directory di lavoro .

  1. modifica file:, nano ~/.bash_completionaggiungere quanto segue:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
  2. crea directory: mkdir ~/.bash_completion.d

  3. modifica file:, ~/.bash_completion.d/myscriptaggiungere quanto segue:

    _myscript_tab_complete () {
        local cur prev opts
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        words="-f -h --etc"
    
        COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
        return 0
    }
    complete -F _myscript_tab_complete myscript
  4. sorgente .bash_completion: . ~/.bash_completion

Aggiornare

Se si prevede di avere una ~/.bash_completion.d/directory vuota e si desidera evitare di visualizzare il messaggio di errore bash: /home/<username>/.bash_completion.d/*: No such file or directory, aggiungere un test del tipo di file con [ -f "$bcfile" ].

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done

2

La risposta di Russell E Glaue è ottima ma ~/.bash_completionè incompleta.

Il problema è quando ~/.bash_completion.d/è vuoto e successivamente for f in ~/.bash_completion.d/*stampa il seguente messaggio di errore:

-bash: /home/user/.bash_completion.d/*: nessun file o directory

La soluzione più semplice e portatile è saltare il ciclo se la directory è vuota:

if [[ -d ~/.bash_completion.d/ ]] && \
   ! find ~/.bash_completion.d/. ! -name . -prune -exec false {} +
then
    for f in ~/.bash_completion.d/*
    do
        source "$f"
    done
fi

1

Una soluzione più semplice consiste nell'utilizzare l'opzione nullglob. Anche se questo non è portatile, non lo sono nemmeno i completamenti bash. Quindi la portabilità non ha importanza.

Inoltre, ti consigliamo di utilizzare le virgolette intorno alla variabile durante l'approvvigionamento. Questo gestisce il caso in cui il file ha spazi altri altri caratteri speciali.

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done

1
Cordiali saluti, una spiegazione di (o collegamento a documenti) su qualcosa che viene mostrato (cioè nullglob) è utile per il lettore.
Cometsong,

1

Almeno bash-completamento 2.8 e successive abilitare l'opzione per posizionare i completamenti Bash locali nella directory

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions

I nomi dei file di completamento o dei collegamenti simbolici devono corrispondere ai rispettivi nomi di comando. Questi completamenti vengono caricati solo su richiesta. I completamenti memorizzati nel file ~/.bash_completion vengono caricati sempre.

Riferimento: vedi "D. Dove devo installare i miei completamenti locali?" in https://github.com/scop/bash-completion/blob/master/README.md

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.