2009-02-04 5 views

Antwort

30

Sie sollten in der Lage sein, den compgen Befehl zu verwenden, etwa so:

compgen -A builtin [YOUR STRING HERE] 

Zum Beispiel: "compgen -A gebautet l" liefert

let 
local 
logout 

Sie andere Schlüsselwörter verwenden können, in Ort "eingebaut", um andere Arten der Fertigstellung zu bekommen. BuiltIn gibt Ihnen eingebaute Shell Befehle. „Datei“ gibt Ihnen lokale Dateinamen etc.

Hier ist eine Liste von Aktionen (von der BASH Manpage kompletten die compgen verwendet):

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

nett. Ich hatte damit zu kämpfen und zu vervollständigen, war aber nicht in der Lage, herauszufinden, wie man es benutzt. +1 :) –

+0

äußerst nützlich, und sehr nette Antwort. Vielen Dank! (+1) –

0

Iterate über die Variable $ PATH und tun ls beginningofword* für jedes Verzeichnis im Pfad?

Um es genau gleich zu bekommen, müssten Sie nur ausführbare Dateien herausfiltern und nach Namen sortieren (sollte ziemlich einfach mit ls Flags und dem Befehl sort sein).

0

Was angezeigt wird, wenn Sie die Binärdateien in Ihrem PFAD treffen, die mit dieser Zeichenfolge beginnen. Wenn also Ihre PATH-Variable folgendes enthält: PATH =/usr/local/bin:/usr/bin:/bin:/usr/spiele:/usr/lib/java/bin:/usr/lib/java/jre/bin :/usr/lib/qt/bin:/usr/teilen/texmf/bin :.

Bash wird in jedem dieser Verzeichnisse nachschlagen, um Ihnen die Vorschläge zu zeigen, sobald Sie drücken. Um also die Liste der Befehle, die mit "ls" beginnen, in eine Variable zu bekommen, könnten Sie folgendes tun: MYVAR = $ (ls/usr/lokal/bin/ls */usr/bin/ls */bin/ls *) Natürlich Sie könnten alle anderen Verzeichnisse hinzufügen, die ich nicht habe.

+0

Siehe meine Antwort unten für eine schnelle Möglichkeit, $ PATH zu parsen (nicht meine Idee, ich habe es gestohlen) ... – dmckee

1

Wenn Sie genau wollen, wie bash würde Vollständig

compgen schließt mit den gleichen Regeln ab, die bash beim Tabbing verwendet.

1

JacobMs Antwort ist großartig. Denn es manuell zu tun, würde ich so etwas wie folgt verwenden:

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

Der Test, bevor der Ausgang sicher ist nur ausführbar, werden reguläre Dateien angezeigt. Das obige zeigt alle Befehle beginnend mit mod.

1

Interessant, wusste ich nicht über compgen.Hier ist ein Skript, das ich verwendet habe, es zu tun, die nicht für nicht-ausführbare Dateien nicht überprüft:

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

speichern das Skript irgendwo in Ihrem $PATH (Ich nannte es findcmd), chmod u+w es, und es dann einfach zu verwenden wie grep, vorbei an Ihre bevorzugten Optionen und Muster:

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

Würde diese Liste eingebaut? – legends2k

0

Just for fun, eine weitere manuelle Variante:

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

wobei pattern das Dateinamensmuster angibt, das Sie verwenden möchten. Dadurch werden Befehle vermisst, die nicht global ausführbar sind, für die Sie jedoch Berechtigungen besitzen.

[getestet auf Mac OS X]


Verwenden Sie die -or und -and Flaggen eine umfassendere Version dieses Befehls zu bauen:

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

werden die Dateien holen Sie die Berechtigung für durch Tugend, sie zu besitzen. Ich sehe keinen allgemeinen Weg, all die zu bekommen, die man aufgrund der Gruppenzugehörigkeit ausführen kann, ohne viel mehr zu programmieren.

2

Ein Spaß Weg, dies zu tun ist M-* (Meta ist in der Regel links Alt).

Als Beispiel geben Sie dies:

$ lo 

Dann M-* getroffen:

$ 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 

Sie können in man 3 readline mehr darüber lesen; Es ist ein Merkmal der readline Bibliothek.