bash - 使用远程数据制作 Cobra 标志 bash 完成

标签 bash go bash-completion go-cobra

我正在研究 Cobra - 基于 Go 的应用程序,我想对命令行标志进行 bash 补全:

$ my-cool-app --some-id=

--some-id 标志的有效值列表可通过一些 HTTP 调用获得。如何使用 Cobra 使这种 bash 补全可用?

最佳答案

来自This answer :

我在其中创建了一个完成功能,用于与 进行交互服务器。

.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'

当然,您可以使用 curlnc 甚至 /dev/tcp 而不是 wgetopenssl ( 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/

相关文章:

bash - 使用 curl (BASH) 通过 Pingdom API 暂停 Pingdom 检查

go - 在同一个包中调用函数和变量,但使用构建标签调用不同的文件

将带有字符串数组作为参数的 glib C 方法转换为 Go

macos - OSX 终端波浪号 bash 完成

Bash 完成 : Allow flags once

linux - 没有更新以反射(reflect)新文件吗?

Linux:使用另一个环境变量的一部分设置环境变量

bash - 在 bash 中,如何通过参数替换获取没有最终扩展名的文件名?

go - 如何执行shell内置命令

bash - Cygwin git 选项卡补全