【发布时间】:2014-07-01 15:32:46
【问题描述】:
如何以编程方式完成另一个命令?
假设我的当前目录有文件a1、a2和a3,那么我怎样才能让我的命令调用ls a的自动补全来取回a1 a2 a3?
这可能吗?
说明和理由:
我选择了ls,因为人们可以与它产生共鸣。这是一个人为的例子,但让我试着举例说明这个功能的价值。我有一个名为build 的命令,给定一个目录,它可以自动完成可以在该目录中构建的目标。这些目标可能与该目录中的文件不对应。目标可能是由我不想解析的构建文件中的build 命令挖掘的。换句话说:
build path/to/dir/TABTAB
可能会给:
path/to/dir/a_target
path/to/dir/b_target
build 是一个预先存在的命令,我不能继续修改以适应我的目的。而且它提取目标的方式是我当然不想知道的。
现在假设我有一个完整的 buildable 项目存储库,我的大部分工作以及我的大部分 build 工作都只发生在一个项目中。也就是说,我总是buildmy/project/directory下的某个目标。
到目前为止一切顺利。
所以我想为构建命令编写一个包装器,不需要我每次运行它时都为其提供目录路径。我希望它知道我的首选项目目录(或多个目录,为什么不),让我在不限定它们的情况下引用目标:
所以假设我有:
my/project/directory/a_target
my/project/directoryb_target
我想要这个:
mybuildTABTAB
给我:
a_target
b_target
当然我需要为mybuild编写完成代码,但我希望它依赖于build的完成,因为我不能只去要求build的开发人员编写一个@ 987654342@ 命令只是为了让我开心。该功能已经存在,在 build 的完成中,我需要利用它。
(当然,当我运行mybuild a_target时,它会知道运行build my/project/directory/a_target,并且我知道如何实现并且不在这个问题的范围内。)
我希望这能说明为什么我需要利用 build 命令的完成并将其用作黑匣子。
【问题讨论】:
-
为什么你认为你需要自动化shell的这个交互特性?你想做什么? (
ls a*将为您提供以“a”开头的所有文件的列表。) -
查看我新添加的理由。
-
您可以在
bash中为mybuild定义自己的补全,这样制表符补全只会建议存在于某个环境变量指定的目录中的文件。我建议阅读bash手册页中的可编程完成(这不是最清晰的文档,但请尝试一下),并在您第一次尝试编码后再次询问。 -
build命令的完成不适用于文件。它从一些 make 文件中提取构建目标。我将定义我自己的完成,但它需要使用build的完成来知道要呈现给我的目标。
标签: bash shell tab-completion