一般有没有办法将配置文件解压缩到 cli 标志?

Is there a way to unpack a config file to cli flags in general?

基本上是 foo(**bar) 在 python 中的作用,在这里我想要类似

的东西
foo **bar.yaml

那会变成

foo --bar1=1 --bar2=2

bar.yaml 的位置

bar1: 1
bar2: 2

您可以使用 sedxargs 的组合:

sed -E 's/^(.+):[[:space:]]+(.+)$/--=/' bar.yaml | xargs -d '\n' foo

sed 转换 bar.yaml 行的格式(例如 bar1: 1 -> --bar1=1)并且 xargs 将转换后的行作为参数提供给 foo.

您当然可以 modify/extend sed 部分来支持其他格式或单破折号选项,例如 -v.


要测试这是否符合您的要求,您可以 运行 这个 Bash 脚本而不是 foo:

#!/usr/bin/env bash
echo "Arguments: $#"
for ((i=1; i <= $#; i++)); do
    echo "Argument $i: '${!i}'"
done

这是 zsh 的版本。 运行 此代码或将其添加到 ~/.zshrc:

function _yamlExpand {
    setopt local_options extended_glob

    # 'words' array contains the current command line
    # yaml filename is the last value
    yamlFile=${words[-1]}

    # parse 'key : value' lines from file, create associative array
    typeset -A parms=("${(@s.:.)${(f)"$(<${yamlFile})"}}")

    # trim leading and trailing whitespace from keys and values
    # requires extended_glob
    parms=("${(kv@)${(kv@)parms##[[:space:]]##}%%[[:space:]]##}")

    # add -- and = to create flags
    typeset -a flags
    for key val in "${(@kv)parms}"; do
        flags+=("--${key}='${val}'")
    done

    # replace the value on the command line
    compadd -QU -- "$flags"
}

# add the function as a completion and map it to ctrl-y
compdef -k _yamlExpand expand-or-complete '^Y'

zsh shell 提示符下,输入命令和 yaml 文件名:

% print -l -- ./bar.yaml▃

将光标紧跟在 yaml 文件名之后,按 ctrl+y。 yaml 文件名将替换为扩展参数:

% print -l -- --bar1='1' --bar2='2' ▃

现在你已经准备好了;您可以按回车键或添加参数,就像任何其他命令行一样。


备注:

  • 这仅支持您示例中的 yaml 子集。
  • 您可以向函数添加更多 yaml 解析,可以使用 yq
  • 在此版本中,光标必须位于 yaml 文件名旁边 - 否则 words 中的最后一个值将为空。您可以添加代码来检测这种情况,然后使用 compset -n.
  • 更改 words 数组
  • compaddcompsetzshcompwid 手册页中有描述。
  • zshcompsys 有关于 compdef 的详细信息;关于自动加载文件的部分描述了另一种部署此类内容的方法。