我正在研究 Cobra - 基于 Go 的应用程序,我想对命令行标志进行 bash 补全:
$ my-cool-app --some-id=
--some-id
标志的有效值列表可通过一些 HTTP 调用获得。如何使用 Cobra 使这种 bash 补全可用?
最佳答案
来自This answer :
我在其中创建了一个完成功能,用于与 minecraft 进行交互服务器。
.0 序言:一个函数
至于赏金:
Please provide a clear and scalable sample code
有一个很好的函数旨在为 stackoverflow.com
创建一个 URL:
soUrl() {
local __so_url='https://stackoverflow.com/'
if [ "$1" = "-v" ]; then
printf -v "$2" '%s%s' "$__so_url" "$3"
else
printf '%s%s\n' "$__so_url" "$1"
fi
}
用法:
soUrl
https://stackoverflow.com/
soUrl fooBar
https://stackoverflow.com/fooBar
或者创建一个变量:
soUrl -v testvar baz
echo $testvar
https://stackoverflow.com/baz
.1 收集数组中的可用选项
The list of valid values for --some-id flag is available by making some HTTP...
你必须这样写:
wget -O - https://somewhere.net/somepath?someoption... |
sed -ne 's/^.*someRE\(Re2\).*/\1/p'
当然,您可以使用 curl
、nc
甚至 /dev/tcp
而不是 wget
或 openssl
( Login to a site (stackoverflow) by bash )
但是因为您可能必须在命令行上进行多次尝试,所以请使用临时文件以避免对网络服务器造成压力!直到您能够显示所有可用选项。
.1b 然后创建一个数组:
soUrlOpts=($(soUrl -v var;wget -qO - $var | sed -ne '/a href="\//{
s/.*a href="\/\([^"\/?]*\)[?\/"].*/\1/;H;};${x;:a;
s/\n\([^\n]\+\)\(\n\(.*\n\|\)\)\1\n/\n\1\2\n/;ta;s/^\n//;s/\n\+/ /g;p;}'))
或
soUrlOpts=($(
soUrl -v var
wget -qO - $var |
sed -ne '
/a href="\//{
s/.*a href="\/\([^"\/?]*\)[?\/"].*/\1/;
H;
};
${
x;
:a;
s/\n\([^\n]\+\)\(\n\(.*\n\|\)\)\1\n/\n\1\2\n/;
ta;
s/^\n//;
s/\n\+/ /g;
p;
}'
))
确保你的变量是正确的:
declare -p soUrlOpts
declare -a soUrlOpts=([0]="company" [1]="teams" [2]="questions" [3]="jobs"
[4]="collectives" [5]="users" [6]="advertising" [7]="talent" [8]="help")
.2 启用完成
complete -W "${soUrlOpts[*]}" soUrl
那么现在,如果你写:soUrl -v testvar q
,然后点击Tab,控制台必须写question
:
soUrl -v testvar questions
echo $testvar
https://stackoverflow.com/questions
关于bash - 使用远程数据制作 Cobra 标志 bash 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51843740/