是否有一行代码可以列出 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
使用 POSIXfind
和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 ..
答案4
我想出了这个:
IFS=':';for i in $PATH; do test -d "$i" && find "$i" -maxdepth 1 -executable -type f -exec basename {} \;; done
编辑:这似乎是唯一一个在 apache 用户读取 bin 目录中的某些文件时不会触发 SELinux 警报的命令。