我正在尝试在可从 bash 访问的系统上打印所有程序文件名。(例如路径)我一直在使用'which $(compgen -c)',但这似乎效率不高。有没有更好的办法?
问问题
69 次
1 回答
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]++')
如果您的命令有空格,请IFS=$'\n'
在子 shell 中使用:
( 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 "${__[@]}"
于 2013-08-30T23:05:16.117 回答