列出 $PATH 中的所有二进制文件

列出 $PATH 中的所有二进制文件

是否有一行代码可以列出 Bash 中 $PATH 中的所有可执行文件?

答案1

这不是答案,但它显示二进制文件,您可以运行的命令

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.

答案2

使用 zsh:

whence -pm '*'

或者:

print -rC1 -- $commands

(请注意,对于出现在 的多个组件中的命令$PATH,它们将仅列出第一个)。

如果您想要没有完整路径的命令,并进行排序以便更好地衡量:

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

(也就是说,获取该关联数组的键而不是值)。

答案3

在任何 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' "${f##*/}"; done; done; } | sort

如果您没有空组件$PATH(使用.替代),也没有以 开头的组件-,也没有 PATH 组件或可执行文件名称中的通配符\[?*,并且没有以 开头的可执行文件.,您可以将其简化为:

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

使用 POSIXfindsed

{ 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 ..

有更简单的解决方案在bash中在 zsh 中

答案4

我想出了这个:

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

编辑:这似乎是唯一一个在 apache 用户读取 bin 目录中的某些文件时不会触发 SELinux 警报的命令。

相关内容