使用路径名打印所有命令

时间:2013-08-30 22:29:50

标签: bash bash-completion

我正在尝试在可从bash访问的系统上打印所有程序文件名。 (例如路径) 我一直在使用'哪个$(compgen -c)',但这看起来效率不高。还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这似乎更快:

IFS=: read -ra __ <<< "$PATH"
find "${__[@]}" -mindepth 1 -maxdepth 1 -xtype f -executable

这并不快,但它可以准确地打印文件系统中的命令,并且只为每个名称打印一个路径,具体取决于首先执行的路径,而不是两次。如果/bin/echo/usr/bin/echo都存在则只打印两者中的任何一个。可能会发生这种情况,因为compgen -c不仅会打印文件系统中找到的echo,还会打印echo内置命令。上面的命令将打印$PATH中找到的所有可执行文件。

type -P $(compgen -c | awk '!a[$0]++')

如果您的命令有空格,请在子shell中使用IFS=$'\n'

( IFS=$'\n'; type -P $(compgen -c | awk '!a[$0]++'); )

禁用路径名扩展也可能更安全:

( IFS=$'\n'; set -o noglob; type -P $(compgen -c | awk '!a[$0]++'); )

也保存到数组:

IFS=$'\n' read -rd '' -a __ < <(compgen -c | awk '!a[$0]++')
type -P "${__[@]}"