如何以编程方式查询给定字符串的 bash 补全

如何以编程方式查询给定字符串的 bash 补全

我想问 bash 如何完成一个字符串,就像我在 shell 中输入它并按下 tab 键一样。例如,如果我输入

ls /[TAB][TAB]

我看到了 / 中可能完成 ls 命令的文件和目录列表。我该如何询问 bash 如何完成“ls /”,而无需键入它并按下 tab 键?我想要类似的东西:

query_complete 'partial command line string'

我阅读了 complete 和 compgen 的手册页,但不知道如何使用它们。

注意:'ls /' 不是我感兴趣的实际命令,只是一个例子。我正在寻找代表部分命令行的任意字符串的通用解决方案。

答案1

您可以尝试:

compgen -o default /

答案2

显然,Awesome WM 有一个巧妙的技巧来掌握这一点。

https://stackoverflow.com/questions/3520936/accesssing-bash-completions-for-specific-commands-programmatically

但我似乎无法让它正常工作。如果你运气好的话请告诉我。

答案3

您可以使用使用 bash 的函数参数扩展, 像这样:

expand(){ echo ${a:+$1}; }; expand "ls /*"

但您需要将 [TAB][TAB] 替换为“*”。

答案4

我认为一个不错的选择是研究可以为 .bashrc 文件编写的 bash 函数。我猜你最终会一遍又一遍地输入命令,并且你想加快速度。以下是我的 .bashrc 文件中的示例:

newmod() {
mkdir -p ${1}/{manifests,files,templates} && \
echo "class $1" >> ${1}/manifests/init.pp && \
echo "class ${1}::conf" >> ${1}/manifests/conf.pp && \
echo "class ${1}::packages" >> ${1}/manifests/packages.pp
} 

我创建了很多 puppet 模块。当从 shell 调用此函数时,它会为我完成以下工作:

[configmgr@mback-dev ~]$ newmod testmodule
[configmgr@mback-dev ~]$ tree testmodule/
testmodule/
|-- files
|-- manifests
|   |-- conf.pp
|   |-- init.pp
|   `-- packages.pp
`-- templates

3 directories, 3 files
[configmgr@mback-dev ~]$ 

这些文件会填充模块类、包和配置的脚手架。这节省了我打字!

HTH,ztron

相关内容