Existe uma maneira "fácil" de executar um comando no estilo "ls -la" para listar todos os arquivos / binários executáveis no PATH atual?
(Pretendo canalizar a saída para o grep, para procurar comandos com prefixos desconhecidos, mas basicamente com "nomes" conhecidos, o tipo de caso em que o preenchimento automático / tabulação no bash é essencialmente inútil. recurso completo "...)
bash
ls
path
autocomplete
sme
fonte
fonte
ls -la
?Respostas:
fonte
which $(compgen -A function -abck)
?Aqui está uma função que lista o conteúdo dos diretórios
$PATH
. Se passados argumentos, a função lista apenas comandos cujo nome contém um dos argumentos. Os argumentos são interpretados como padrões glob.Como muitas coisas, isso é mais fácil no zsh.
O
^
caractere na expansão de parâmetro faz com que o texto concatenado com a matriz seja adicionado a cada elemento da matriz, por exemplo,path=(/bin /usr/bin); echo $^path/foo
impressões/bin/foo /usr/bin/foo
./*$^@*
parece um insulto à história em quadrinhos, mas na verdade é o caractere comum/
, o curinga*
, o parâmetro especial$@
(a matriz do parâmetro posicional) com o^
modificador e, novamente*
.(N:t)
é o qualificador globalN
para obter uma expansão vazia se não houver correspondência seguida pelo modificador de históricot
para manter apenas o nome da base ("cauda") de cada correspondência.Mais enigmático, evita a chamada externa, mas isso é apenas de interesse cosmético:
De fato, você pode estar procurando pelo
apropos
comando, que procura por páginas de manual de comandos cuja descrição curta contém uma palavra-chave. Uma limitação é que isso encontra apenas comandos que possuem uma página de manual.fonte
^
parece resultar em nenhuma saída para uma chamada "sem argumentos"? Se você largá-lo, poderá listá-los todos e ainda procurar palavras-chave únicas (mas não uma lista delas). O(Non:t)
parece dizer que asteriscos deve ser expandido? Não foi possível descobrir esse último.path
, mas quando o executo no shell, é de fato $ PATH, mas com espaços em vez de:
. O resto é cristal :) clara$path
é um recurso zsh: é um parâmetro vinculado , uma matriz que é atualizada automaticamente quandoPATH
é atualizada e vice-versa.a descoberta corresponde apenas a: tem pelo menos um bit "x" (executável) definido e esse não é um diretório.
e use-o com uma lista de regexp a ser encontrada:
fonte
echo $PATH | tr ':' '\n' | sort | uniq -d
primeiro ecoamos
$PATH
em sed e substituímos ":" por "".em seguida, localizamos cada uma dessas coisas para encontrar arquivos com o rwx e ecoá-los.
2> /dev/null
é assimfind
não vai imprimir errosfonte
-maxdepth 1
e-type f
na sua localização, caso contrário, você encontrará subdiretórios e seus arquivos (que a pesquisa PATH não precisará). Além disso, seu teste de permissão é estranho - deveria apenas+x
, eu acho?:/bin
ou/bin::/usr/bin
. Tente adicionars/::/:.:/;s/^:/.:/;s/:$/:./
aosed
comando.find
possível pesquisar mais caminhos, para que você possa fazê-lo sem o loop:find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …
é claro que os nomes de diretórios que contêm espaços atrapalharão, mas o baseado no loop tem o mesmo problema.for
. Entãofor
, repetirá uma lista de 4 palavras. Para manipular repartição de palavras melhor definir oIFS
acordo com sua necessidade:IFS=':'; find $PATH -perm +rwx …
.