我可以使用哪个命令列出以字母 g 开头的所有命令?
我已阅读在这里提问但我寻求一个没有任意限制的答案。如果 shell 补全给出了答案,则应将其包括在内。
但是,如果有一个答案可以在许多/大多数 shell 中运行,那就更好了。
会:
( set -f; find ${PATH//:/ } -type f -maxdepth 1 -executable )
是一个合适的答案吗?并非所有人find
都有所有这些选项,对吗?
答案1
find
您显示的命令,
( set -f; find ${PATH//:/ } -type f -maxdepth 1 -executable )
适合大多数情况,因为它是在find
安装了 GNU 的机器上运行的,GNU 实现了-maxdepth
和-executable
(并且我真的不想尝试为-executable
使用标准find
谓词制作等效的测试)。它还需要bash
对 的值进行参数替换PATH
,将每个值更改:
为空格(这也可以通过按原样设置IFS=:
和使用不带引号的变量来完成,从而消除对 的要求bash
)。
在另一个答案对于类似的问题,我还保护该find
命令免于将搜索路径解释为潜在的选项--
。此处显示的命令使用的是 的方法IFS
,并且在对其进行一些适当的测试后也进行了稍微调整:
(
set -f; IFS=:
find -L -- $PATH -maxdepth 1 ! -type d -executable
)
确保! -type d
还可以找到可执行的符号链接,而不是目录。该-L
选项确保与找到的符号链接相关的元数据取自链接所指向的内容(这可以防止找到可访问(即可执行)子目录的符号链接)。
对此进行测试compgen -c
表明bash
,compgen -c
将生成与上述命令的结果重叠的命令列表find
,并且compgen -c
找到的任何其他命令仅限于没有外部实现的内置命令。
显然,要将其限制为以字符 开头的命令g
,您还需要使用-name 'g*'
( compgen -c g
in bash
)。
提供命令制表符补全功能的 shell(例如bash
)可以公开与此机制交互的命令。这些命令不太可能在 shell 之间移植,甚至可能在同一 shell 的版本之间也不能移植。上面的命令find
似乎提供了一个相当好的近似选项卡完成功能外部的命令会给你,但只依赖于 af GNU 的存在find
。
-executable
有关使用标准谓词重写谓词的信息find
,请参阅斯特凡·查泽拉斯的回答另一个问题(涉及-readable
,但解决方案类似于-executable
)。
该-maxdepth
谓词也是非标准的,但更常在find
命令的各种变体中实现。