Respuestas:
Esta no es una respuesta, pero muestra binario, un comando que puede ejecutar
compgen -c
(asumiendo bash
)
Otros comandos útiles
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.
in
, {
...) y alias.
Con zsh:
whence -pm '*'
O:
print -rl -- $commands
(tenga en cuenta que para los comandos que aparecen en más de un componente de $PATH
, solo enumerarán el primero).
Si desea los comandos sin las rutas completas, y ordenados por si acaso:
print -rl -- ${(ko)commands}
(es decir, obtenga las claves de esa matriz asociativa en lugar de los valores).
En cualquier shell POSIX, sin utilizar ningún comando externo (suponiendo que printf
está integrado, si no se recurre a él echo
), excepto para la clasificación final, y suponiendo que ningún nombre ejecutable contenga una nueva línea:
{ 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
Si no tiene ningún componente vacío en $PATH
(use .
en su lugar) ni componentes que comiencen -
, ni caracteres comodín \[?*
en componentes de RUTA o nombres ejecutables, y no hay ejecutables que comiencen con .
, puede simplificar esto para:
{ IFS=:; for d in $PATH; do for f in $d/*; do [ -f $f ] && [ -x $f ] && echo ${x##*/}; done; done; } | sort
Usando POSIX find
y sed
:
{ IFS=:; set -f; find -H $PATH -prune -type f -perm -100 -print; } | sed 's!.*/!!' | sort
Si está dispuesto a enumerar el raro archivo no ejecutable o el archivo no regular en la ruta, hay una manera mucho más simple:
{ IFS=:; ls -H $PATH; } | sort
Esto omite los archivos de puntos; si los necesita, agregue la -A
bandera ls
si la tiene, o si desea adherirse a POSIX:ls -aH $PATH | grep -Fxv -e . -e ..
$PATH
está configurado y no contiene componentes vacíos, y que los componentes no parecen encontrar predicados (u opciones ls). Algunos de ellos también ignorarán los archivos de puntos.
yash
y zsh
en emulación sh).
find
uno. -prune
evitará la inclusión de directorios. Probablemente desee en -L
lugar de -H
incluir enlaces simbólicos (comunes para los ejecutables). -perm -100
no garantiza que el archivo sea ejecutable por usted (y podría (improbable) excluir archivos ejecutables).
Se me ocurrió esto:
IFS=':';for i in $PATH; do test -d "$i" && find "$i" -maxdepth 1 -executable -type f -exec basename {} \;; done
EDITAR : Parece que este es el único comando que no activa la alerta SELinux mientras lee algunos de los archivos en el directorio bin por el usuario de apache.
for
? IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
está configurado y no contiene caracteres comodín y no contiene componentes vacíos. Eso también supone la implementación de GNU de find
.
-type f
lugar de (GNU específico) -xtype f
, eso también omitirá enlaces simbólicos. Eso tampoco enumerará el contenido de $PATH
componentes que son enlaces simbólicos.
Qué tal esto
find ${PATH//:/ } -maxdepth 1 -executable
La sustitución de cadena se usa con Bash.
$PATH
está configurado, no contiene caracteres comodín o en blanco, no contiene componentes vacíos. Eso supone que GNU encuentra también. Tenga en cuenta que ${var//x/y}
es la ksh
sintaxis (también compatible con zsh y bash). Estrictamente hablando, eso también supone que los componentes $ PATH tampoco son find
predicados.
$PATH
componentes no son enlaces simbólicos.
IFS=:
es más robusta que hacer esta sustitución. Las rutas con espacios no son tan infrecuentes en Windows. Los enlaces simbólicos son bastante comunes, pero eso se resuelve fácilmente con -H
.
Si puede ejecutar Python en su shell, también se puede usar el siguiente (ridículamente largo) de una sola línea:
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 fue principalmente un ejercicio divertido para mí mismo para ver si se podía hacer usando una línea de código de Python sin recurrir al uso de la función 'exec'. En una forma más legible, y con algunos comentarios, el código se ve así:
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)) ])
#!/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