E 'possibile ottenere, usando Bash, un elenco di comandi che iniziano con una determinata stringa?
Vorrei ottenere ciò che viene stampato premendo la scheda < due volte dopo aver digitato l'inizio del comando e, ad esempio, memorizzandolo in una variabile.bash: ottieni l'elenco dei comandi che iniziano con una determinata stringa
risposta
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.
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).
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.
Vedere la mia risposta qui sotto per un modo rapido di analizzare $ PATH (non è la mia idea, l'ho rubato) ... – dmckee
Se si vuole esattamente come bash sarebbe completo
COMPLETIONS=$(compgen -c "$WORD")
compgen completa utilizzando le stesse regole bash utilizzate durante la tabulazione.
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
.
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
Questo elenco di built-in? – legends2k
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.
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
.
nice. Ho lottato con questo e completo, ma non sono stato in grado di capire come usarlo. +1 :) –
estremamente utile, e molto bella risposta. Grazie! (+1) –