Listar todos os binários de $ PATH

24

Existe um one-liner que lista todos os executáveis do $ PATH no bash.

    
por jcubic 21.03.2014 / 15:57

7 respostas

29

isto não é uma resposta, mas é show binary, comando que você pode executar

compgen -c

(assumindo bash )

Outro útil

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.
    
por 21.03.2014 / 18:34
10

Com zsh:

whence -pm '*'

Ou:

print -rl -- $commands

(note que para comandos que aparecem em mais de um componente de $PATH , eles listarão apenas o primeiro).

Se você quiser os comandos sem os caminhos completos e classificados para uma boa medida:

print -rl -- ${(ko)commands}

(isto é, obtenha as chaves desse array associativo em vez dos valores).

    
por 21.03.2014 / 18:10
4

Eu inventei isso:

IFS=':';for i in $PATH; do test -d "$i" && find "$i" -maxdepth 1 -executable -type f -exec basename {} \;; done
    
por 21.03.2014 / 16:06
3

Em qualquer shell POSIX, sem usar nenhum comando externo (assumindo que printf esteja embutido, se não retornar a echo ), exceto para a classificação final, e assumindo que nenhum nome executável contenha uma nova linha:

{ set -f; IFS=:; for d in $PATH; do set +f; [ -n "$d" ] || d=.; for f in "$d"/.[!.]* "$d"/..?* "$d"/*; do [ -f "$f" ] && [ -x "$f" ] && printf '%s\n' "${x##*/}"; done; done; } | sort

Se você não tiver nenhum componente vazio em $PATH (use . ) nem componentes começando com - , nem caracteres curinga \[?* em componentes PATH ou nomes executáveis e nenhum executável começando com . , você pode simplificar isso para:

{ IFS=:; for d in $PATH; do for f in $d/*; do [ -f $f ] && [ -x $f ] && echo ${x##*/}; done; done; } | sort

Usando POSIX find e sed :

{ IFS=:; set -f; find -H $PATH -prune -type f -perm -100 -print; } | sed 's!.*/!!' | sort

Se você estiver disposto a listar o arquivo não executável ou o arquivo não regular no caminho, há uma maneira muito mais simples:

{ IFS=:; ls -H $PATH; } | sort

Isso ignora os arquivos de pontos; se você precisar deles, adicione o -A flag a ls se o seu tiver, ou se você quiser ficar com POSIX: ls -aH $PATH | grep -Fxv -e . -e ..

Existem soluções mais simples no bash e no zsh .

    
por 22.03.2014 / 00:03
2

Que tal isso

find ${PATH//:/ } -maxdepth 1 -executable

A substituição de string é usada com o Bash.

    
por 22.03.2014 / 00:04
1

Se você pode rodar python no seu shell, o seguinte (ridiculamente longo) one-liner também pode ser usado:

python -c 'import os;import sys;output = lambda(x) : sys.stdout.write(x + "\n"); paths = os.environ["PATH"].split(":") ; listdir = lambda(p) : os.listdir(p) if os.path.isdir(p) else [ ] ; isfile = lambda(x) : True if os.path.isfile(os.path.join(x[0],x[1])) else False ; isexe = lambda(x) : True if os.access(os.path.join(x[0],x[1]), os.X_OK) else False ; map(output,[ os.path.join(p,f) for p in paths for f in listdir(p) if isfile((p,f)) and isexe((p,f)) ])'

Este foi principalmente um exercício divertido para mim mesmo ver se isso poderia ser feito usando uma linha de código python sem recorrer ao uso da função 'exec'. De uma forma mais legível e com alguns comentários, o código é assim:

import os
import sys

# This is just to have a function to output something on the screen.
# I'm using python 2.7 in which 'print' is not a function and cannot
# be used in the 'map' function.
output = lambda(x) : sys.stdout.write(x + "\n")

# Get a list of the components in the PATH environment variable. Will
# abort the program is PATH doesn't exist
paths = os.environ["PATH"].split(":")

# os.listdir raises an error is something is not a path so I'm creating
# a small function that only executes it if 'p' is a directory
listdir = lambda(p) : os.listdir(p) if os.path.isdir(p) else [ ]

# Checks if the path specified by x[0] and x[1] is a file
isfile = lambda(x) : True if os.path.isfile(os.path.join(x[0],x[1])) else False

# Checks if the path specified by x[0] and x[1] has the executable flag set
isexe = lambda(x) : True if os.access(os.path.join(x[0],x[1]), os.X_OK) else False

# Here, I'm using a list comprehension to build a list of all executable files
# in the PATH, and abusing the map function to write every name in the resulting
# list to the screen.
map(output, [ os.path.join(p,f) for p in paths for f in listdir(p) if isfile((p,f)) and isexe((p,f)) ])
    
por 22.03.2014 / 17:04
0
#!/usr/bin/env python
import os
from os.path import expanduser, isdir, join, pathsep

def list_executables():
    paths = os.environ["PATH"].split(pathsep)
    executables = []
    for path in filter(isdir, paths):
        for file_ in os.listdir(path):
            if os.access(join(path, file_), os.X_OK):
                executables.append(file_)
    return executables
    
por 13.02.2016 / 07:45