2009-02-04 18 views

risposta

30

Si dovrebbe essere in grado di utilizzare il comando compgen, in questo modo:

compgen -A builtin [YOUR STRING HERE] 

Ad esempio, "compgen -A incorporato l" restituisce

let 
local 
logout 

È possibile utilizzare altre parole chiave in luogo di "built-in" per ottenere altri tipi di completamento. Builtin ti fornisce i comandi integrati della shell. "File" ti dà i nomi dei file locali, ecc

Ecco un elenco di azioni (dalla pagina man bash per completa che utilizza compgen):

alias  Alias names. May also be specified as -a. 
    arrayvar Array variable names. 
    binding Readline key binding names. 
    builtin Names of shell builtin commands. May also be specified as -b. 
    command Command names. May also be specified as -c. 
    directory Directory names. May also be specified as -d. 
    disabled Names of disabled shell builtins. 
    enabled Names of enabled shell builtins. 
    export  Names of exported shell variables. May also be specified as -e. 
    file  File names. May also be specified as -f. 
    function Names of shell functions. 
    group  Group names. May also be specified as -g. 
    helptopic Help topics as accepted by the help builtin. 
    hostname Hostnames, as taken from the file specified by the HOSTFILE shell 
       variable. 
    job  Job names, if job control is active. May also be specified as 
       -j. 
    keyword Shell reserved words. May also be specified as -k. 
    running Names of running jobs, if job control is active. 
    service Service names. May also be specified as -s. 
    setopt  Valid arguments for the -o option to the set builtin. 
    shopt  Shell option names as accepted by the shopt builtin. 
    signal  Signal names. 
    stopped Names of stopped jobs, if job control is active. 
    user  User names. May also be specified as -u. 
    variable Names of all shell variables. May also be specified as -v. 
+0

nice. Ho lottato con questo e completo, ma non sono stato in grado di capire come usarlo. +1 :) –

+0

estremamente utile, e molto bella risposta. Grazie! (+1) –

0

Iterare sulla variabile $ PATH e fare ls beginningofword* per ogni directory nel percorso?

Per ottenere esattamente l'equivalente, è necessario filtrare solo i file eseguibili e ordinare per nome (dovrebbe essere piuttosto semplice con ls flag e il comando sort).

0

Ciò che viene elencato quando si preme sono i file binari nel PERCORSO che iniziano con quella stringa. Quindi, se la variabile PATH contiene: PERCORSO =/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib/java/bin:/usr/lib/java/jre/bin :/usr/lib/qt/bin:/usr/share/texmf/bin :.

Bash guarderà in ognuna di quelle directory per mostrarti i suggerimenti una volta colpito. Quindi, per ottenere l'elenco di comandi che iniziano con "ls" in una variabile che potresti fare: MYVAR = $ (ls/usr/local/bin/ls */usr/bin/ls */bin/ls *) Naturalmente potresti aggiungere tutte le altre directory che non ho.

+0

Vedere la mia risposta qui sotto per un modo rapido di analizzare $ PATH (non è la mia idea, l'ho rubato) ... – dmckee

1

Se si vuole esattamente come bash sarebbe completo

COMPLETIONS=$(compgen -c "$WORD") 

compgen completa utilizzando le stesse regole bash utilizzate durante la tabulazione.

1

La risposta di JacobM è ottima. Per farlo manualmente, vorrei usare qualcosa di simile:

echo $PATH | tr : '\n' | 
while read p; do 
    for i in $p/mod*; do 
    [[ -x "$i" && -f "$i" ]] && echo $i  
    done 
done 

Il test prima che l'uscita si assicura che vengono mostrati solo i file regolari, eseguibili. Quanto sopra mostra tutti i comandi che iniziano con mod.

1

Interessante, non sapevo di compgen.Ecco uno script che ho usato per farlo, che non controlla per i non-eseguibili:

#!/bin/bash 
echo $PATH | tr ':' '\0' | xargs -0 ls | grep "[email protected]" | sort 

Salva lo script da qualche parte nel vostro $PATH (ho chiamato findcmd), chmod u+w esso, e quindi utilizzare solo come grep, passando le opzioni e modello preferiti:

findcmd ^foo # finds all commands beginning with foo 
findcmd -i -E 'ba+r' # finds all commands matching the pattern 'ba+r', case insensitively 
+0

Questo elenco di built-in? – legends2k

0

Solo per divertimento, un'altra variante manuale:

find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f -perm -001 -print 

dove pattern specifica il modello del nome del file che si desidera utilizzare. Mancheranno comandi che non sono eseguibili globalmente, ma per i quali hai il permesso.

[testato su Mac OS X]


Utilizzare i -or e -and bandiere di costruire una versione più completa di questo comando:

find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f 
            \(\ 
             -perm -001 -or \ 
             \(-perm -100 -and -user $(whoami)\) \ 
            \) -print 

file prenderà di avere il permesso dal virtù di possederli. Non vedo un modo generale per ottenere tutti quelli che puoi eseguire in virtù dell'affiliazione di gruppo senza molta più codifica.

2

Un modo divertente per farlo è quello di colpire M-* (Meta è in genere lasciato Alt).

A titolo di esempio, digitare questo:

$ lo 

poi ha colpito M-*:

$ loadkeys loadunimap local locale localedef locale-gen locate 
    lockfile-create lockfile-remove lockfile-touch logd logger login 
    logname logout logprof logrotate logsave look lorder losetup 

Si può leggere di più su questo in man 3 readline; è una funzionalità della libreria readline.