我正在研究 Bash 的可编程完成,但有些东西我不太明白。
环境
这是我bash --version
在终端中运行时得到的结果。
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
我正在运行这一切Ubuntu 22.04.2 LTS
我有两个文件。
文件 1(脚本)
第一个是我想要可编程完成的脚本,如下所示:
#!/usr/bin/env bash
#Script: dothis
echo "COMMAND: $0 $@"
正如您所看到的,这是一个虚拟脚本,它打印脚本的名称,后跟参数。
文件 2(可编程完成脚本)
第二个文件是负责前面脚本的可编程完成的文件,如下所示:
#!/usr/bin/env bash
_dothis_completions(){
# -S suffix
COMPREPLY=($(compgen -A user -S '_suffix' "${COMP_WORDS[1]}"))
# -P prefix
#COMPREPLY=($(compgen -A user -P 'prefix_' "${COMP_WORDS[1]}"))
}
complete -F _dothis_completions dothis
当我将它与选项-S
(为建议附加后缀)一起使用时,它工作得很好。它为我提供了系统中不同用户的建议,并附_suffix
在最后。
现在,如果我修改可编程完成的脚本,如下所示:
#!/usr/bin/env bash
_dothis_completions(){
# -S suffix
#COMPREPLY=($(compgen -A user -S '_suffix' "${COMP_WORDS[1]}"))
# -P prefix
COMPREPLY=($(compgen -A user -P 'prefix_' "${COMP_WORDS[1]}"))
}
complete -F _dothis_completions dothis
(请注意,现在我想使用该-P
标志将前缀附加prefix_
到所有建议中)
我在命令行中再次尝试,这是行不通的。
有谁知道为什么这不起作用?
预先非常感谢!
更新(2023 年 7 月 29 日)
我决定使用 Zsh 中的 Bash 的可编程补全功能,并且似乎工作没有问题。
希望这些信息能够帮助我们找到“-P”标志在 Bash 中无法正常工作的原因的答案。
答案1
问题是,compgen -P ...
只有当只剩下一种选择时,这似乎才有意义。也许您可以通过在生成补全时删除前缀来解决此问题。
我的建议是检查是否已输入任何内容以及是否只剩下一个补全。这可能不适用于两个值,其中一个是另一个的第一部分,例如
- 富
- 富巴
foo
那时你无法选择。
_dothis_completions(){
local -a tmp_array=()
# -S suffix
#COMPREPLY=($(compgen -A user -S '_suffix' "${COMP_WORDS[1]}"))
# -P prefix
if [ -z "${COMP_WORDS[COMP_CWORD]}" ]; then
COMPREPLY=($(compgen -A user "${COMP_WORDS[1]}"))
else
tmp_array=( $(compgen -A user "${COMP_WORDS[1]}") )
if [ "${#tmp_array[@]}" -eq 1 ]; then
COMPREPLY=($(compgen -A user -P 'prefix_' "${COMP_WORDS[1]}"))
else
COMPREPLY=($(compgen -A user "${COMP_WORDS[1]}"))
fi
fi
}
complete -F _dothis_completions dothis