![如何以编程方式查询给定字符串的 bash 补全](https://linux22.com/image/538155/%E5%A6%82%E4%BD%95%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E6%9F%A5%E8%AF%A2%E7%BB%99%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%20bash%20%E8%A1%A5%E5%85%A8.png)
我想问 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 有一个巧妙的技巧来掌握这一点。
但我似乎无法让它正常工作。如果你运气好的话请告诉我。
答案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