搜索以某个特定字母开头的命令(针对当前用户)

搜索以某个特定字母开头的命令(针对当前用户)

我可以使用哪个命令列出以字母 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表明bashcompgen -c将生成与上述命令的结果重叠的命令列表find,并且compgen -c找到的任何其他命令仅限于没有外部实现的内置命令。

显然,要将其限制为以字符 开头的命令g,您还需要使用-name 'g*'( compgen -c gin bash)。

提供命令制表符补全功能的 shell(例如bash)可以公开与此机制交互的命令。这些命令不太可能在 shell 之间移植,甚至可能在同一 shell 的版本之间也不能移植。上面的命令find似乎提供了一个相当好的近似选项卡完成功能外部的命令会给你,但只依赖于 af GNU 的存在find

-executable有关使用标准谓词重写谓词的信息find,请参阅斯特凡·查泽拉斯的回答另一个问题(涉及-readable,但解决方案类似于-executable)。

-maxdepth谓词也是非标准的,但更常在find命令的各种变体中实现。

相关内容