gpt4 book ai didi

Bash:以编程方式获取命令的完成输出(例如,在变量中)

转载 作者:行者123 更新时间:2023-11-29 09:11:07 26 4
gpt4 key购买 nike

如何以编程方式完成另一个命令?

假设我的当前目录有文件 a1a2a3,那么如何让我的命令调用 的自动完成>ls a 返回 a1 a2 a3

这可能吗?


澄清和论证:

我选择 ls 是因为人们会产生共鸣。这是一个人为的例子,故意简单,以便人们可以不受干扰地理解问题,但不幸的是,这样的例子有时会让我们离题。 :)

让我尝试举例说明此功能的值(value)。我有一个名为 build 的命令,给定一个目录,它可以自动完成到可以在该目录中构建的目标。这些目标可能与该目录中的文件不对应,因此 glob 完成(* 和其他通配符)将不起作用。 build 命令可能会从我不想解析的构建文件中挖掘目标。换句话说:

build path/to/dir/TABTAB

可能给:

path/to/dir/a_target
path/to/dir/b_target

同样,a_target 和 b_target 不是文件或目录。

build 是一个预先存在的命令,我无法继续修改​​以适合我的目的。它提出有效完成的方式是我当然不想知道或重新发明的东西。

现在假设我有一个完整的build项目库,我的大部分工作和我的大部分build工作只发生在一个项目中。换句话说,我总是在 my/project/directory构建目标。

到目前为止一切顺利。

我想围绕构建命令编写一个包装器,它不需要我在每次运行时都为它提供目录路径。我想让它知道我的首选项目目录(或目录,为什么不呢)并让我在不限定它们的情况下引用目标:

所以假设我有:

my/project/directory/a_target
my/project/directory/b_target

我想要这个:

mybuild TABTAB

给我:

a_target
b_target

基本上,我想修饰和简化 build 的行为以满足我的特定需求。

我需要为 mybuild 编写自己的完成代码,但我希望它依赖于 build 的完成,因为我不能要求开发者build 编写一个 build listtargets 命令只是为了让我开心。 (尽管那样会更健壮。)build 命令已经在某处有代码,给定前缀可以返回所有匹配的目标。它正在完成 build,我需要利用它。

(当然,当我运行mybuild a_target时,我会确保它知道运行build my/project/directory/a_target。我知道如何实现这不在这个问题的范围内。)

我希望这能说明为什么我需要利用 build 命令的完成并将其作为黑匣子调用。

最佳答案

这样做有点奇怪,您需要执行的命令取决于目录中文件的数量——无、一个或多个。但是此命令适用于示例情况:

echo echo a$'\t'$'\t' | bash -i 2>&1 | head -3 | tail -1

自动完成的命令是

echo a

因此将其作为字符流发送,后跟两个制表符,发送到交互式 bash shell 中。 bashstderr 上生成自动完成输出,因此将其重定向到 stdout 并通过 head 进行管道传输tail 从整体中选择一行输出。在这种情况下,这会产生单行输出

a1  a2  a3 

但是,正如其他人所说,只是使用

echo a*

可能会更容易!

关于Bash:以编程方式获取命令的完成输出(例如,在变量中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24514143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com