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

jcu*_*bic 44 shell bash path executable

是否有一个单行程序会在 Bash 中列出 $PATH 中的所有可执行文件?

Rah*_*til 57

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

compgen -c
Run Code Online (Sandbox Code Playgroud)

(假设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.
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道这个命令,我实际上需要可执行文件才能完成。也许我改用这个命令。 (2认同)

Sté*_*las 21

使用 zsh:

whence -pm '*'
Run Code Online (Sandbox Code Playgroud)

或者:

print -rC1 -- $commands
Run Code Online (Sandbox Code Playgroud)

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

如果您想要没有完整路径的命令,并进行排序以获得良好的度量:

print -rC1 -- ${(ko)commands}
Run Code Online (Sandbox Code Playgroud)

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

  • @VladimirPanteleev,在“zsh”中,由“hashexecutablesonly”选项控制。检查文件类型的成本很高,尤其是在网络文件系统上,因为“$PATH”目录中的每个文件都需要一个“stat()”,这就是默认情况下不启用它的原因。在“$PATH”目录中没有垃圾的通常情况下,这通常已经足够好了,但是如果“$PATH”目录仅位于快速文件系统上,则可以设置该选项。 (2认同)

小智 9

这个怎么样

find ${PATH//:/ } -maxdepth 1 -executable
Run Code Online (Sandbox Code Playgroud)

字符串替换与 Bash 一起使用。

  • 假设设置了“$PATH”,不包含通配符或空白字符,也不包含空组件。假设 GNU find 也是如此。请注意,“${var//x/y}”是“ksh”语法(zsh 和 bash 也支持)。严格来说,还假设 $PATH 组件也不是“find”谓词。 (4认同)

Gil*_*il' 8

在任何 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
Run Code Online (Sandbox Code Playgroud)

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

{ IFS=:; for d in $PATH; do for f in $d/*; do [ -f $f ] && [ -x $f ] && echo ${x##*/}; done; done; } | sort
Run Code Online (Sandbox Code Playgroud)

使用 POSIXfindsed

{ IFS=:; set -f; find -H $PATH -prune -type f -perm -100 -print; } | sed 's!.*/!!' | sort
Run Code Online (Sandbox Code Playgroud)

如果您愿意在路径中列出罕见的非可执行文件或非常规文件,还有一个更简单的方法:

{ IFS=:; ls -H $PATH; } | sort
Run Code Online (Sandbox Code Playgroud)

这会跳过点文件;如果您需要它们,请将-A标志添加到ls您的标志中,或者如果您想坚持使用 POSIX:ls -aH $PATH | grep -Fxv -e . -e ..

在 bashzsh 中有更简单的解决方案。


jcu*_*bic 5

我想出了这个:

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

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

  • 为什么是`for`?`IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'` (5认同)
  • 假设设置了 `$PATH` 并且不包含通配符并且不包含空组件。这也假设了 `find` 的 GNU 实现。 (3认同)
  • 由于 `-type f` 而不是(GNU 特定的)`-xtype f`,这也将省略符号链接。这也不会列出作为符号链接的`$PATH` 组件的内容。 (2认同)