我正在创建一个函数来为我使用的命令提供可编程完成(在来自http://www.debian-administration.org/articles/317)。 shell脚本的用法如下:
script.sh command [command options]
其中命令可以是“foo”或“bar”,“foo”的命令选项是“a_foo=value”和“b_foo=value”,“bar”的命令选项是“a_bar=value”和“b_bar=value” 。
这是我正在使用的配置:
_script() {
local cur command all_commands
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
command="${COMP_WORDS[1]}"
all_commands="foo bar"
case "${command}" in
foo)
COMPREPLY=( $(compgen -W "--a_foo --b_foo" -- ${cur}) ); return 0;;
bar)
COMPREPLY=( $(compgen -W "--a_bar --b_bar" -- ${cur}) ); return 0;;
*) ;;
esac
COMPREPLY=( $(compgen -W "${all_commands}" -- ${cur}) )
return 0
}
complete -F _script script.sh
这主要按照我的意愿工作:
% script.sh f[TAB]
完成到:
% script.sh foo
(根据需要带有尾随空格)
然而,这:
% script.sh foo a[TAB]
完成到:
% script.sh foo a_foo
(也带有尾随空格)
我想用“=”替换尾随空格。或者,我愿意将传递给 compgen 的值更改为“--a_foo= --b_foo=”,在这种情况下我可以删除尾随空格。
不幸的是,该命令不受我的控制,因此我无法将命令行选项更改为“--a_foo value”格式而不是“--a_foo=value”。
首先,您需要将 = 添加到 COMPREPLY:
COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) )
接下来你需要告诉完成不要在 = 之后添加空格
compopt -o nospace
所以,你的脚本行应该是:
foo)
COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) ); compopt -o nospace; return 0;;
bar)
COMPREPLY=( $(compgen -W "--a_bar= --b_bar=" -- ${cur}) ); compopt -o nospace; return 0;;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)