Answers:
这不是答案,而是显示二进制文件,您可以运行该命令
compgen -c
(假设bash
)
其他有用的命令
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
,{
...)和别名。
使用zsh:
whence -pm '*'
要么:
print -rl -- $commands
(请注意,对于出现在的多个组件中的命令$PATH
,它们将仅列出第一个组件)。
如果您希望这些命令不包含完整路径,并且进行了合理排序:
print -rl -- ${(ko)commands}
(也就是说,获取该关联数组的键而不是值)。
在任何POSIX Shell中,除了最后的排序外,不使用任何外部命令(假定printf
是内置的,如果不退回echo
),并假定没有可执行文件名称包含换行符:
{ 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
如果您没有$PATH
(使用.
)空组件,也没有以开头的组件-
,也没有\[?*
PATH组件或可执行文件名称中的通配符,也没有以开头的可执行文件.
,则可以简化为:
{ IFS=:; for d in $PATH; do for f in $d/*; do [ -f $f ] && [ -x $f ] && echo ${x##*/}; done; done; } | sort
使用POSIX find
和sed
:
{ IFS=:; set -f; find -H $PATH -prune -type f -perm -100 -print; } | sed 's!.*/!!' | sort
如果您愿意在路径中列出稀有的非可执行文件或非常规文件,则有一种更简单的方法:
{ IFS=:; ls -H $PATH; } | sort
这会跳过点文件;如果需要它们,请添加-A
标志到(ls
如果有),或者如果您想坚持使用POSIX:ls -aH $PATH | grep -Fxv -e . -e ..
$PATH
已设置并且不包含空组件,并且这些组件看起来不像find谓词(或ls选项)。其中一些也将忽略点文件。
yash
和zsh
in中除外)。
find
一个。-prune
将阻止列出目录。您可能想要-L
而不是-H
想要包括符号链接(对于可执行文件是常见的)。-perm -100
不保证您可以执行该文件(并且可能(不太可能)排除可执行文件)。
我想出了这个:
IFS=':';for i in $PATH; do test -d "$i" && find "$i" -maxdepth 1 -executable -type f -exec basename {} \;; done
编辑:看来这是唯一的命令,不会在由Apache用户读取bin目录中的某些文件时触发SELinux警报。
for
呢?IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
已设置并且不包含通配符,也不包含空组件。这也假设GNU的实现find
。
-type f
而不是(特定于GNU)-xtype f
,这也将省略符号链接。这也不会列出作为$PATH
符号链接的组件的内容。
这个怎么样
find ${PATH//:/ } -maxdepth 1 -executable
字符串替换与Bash一起使用。
$PATH
已设置,不包含通配符或空白字符,不包含空组件。假设GNU也找到了。请注意,这${var//x/y}
是ksh
语法(zsh和bash也支持)。严格来说,这也假定$ PATH组件也不是find
谓词。
$PATH
组件不是符号链接。
IFS=:
比执行此替换更健壮。带空格的路径在Windows上并不少见。符号链接相当普遍,但是使用可以轻松解决-H
。
如果您可以在shell中运行python,那么也可以使用以下(非常长)的单行代码:
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)) ])'
对于我自己来说,这主要是一个有趣的练习,看看是否可以使用一行python代码完成操作而无需诉诸'exec'函数。以更易读的形式并带有一些注释,代码如下所示:
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