是否有一种方法来解包配置文件到cli标志?



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

foo **bar.yaml

变成

foo --bar1=1 --bar2=2

其中bar.yaml

bar1: 1
bar2: 2

您可以使用sedxargs的组合:

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

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

您当然可以修改/扩展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'

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

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

将光标放在yaml文件名的后面,按ctrl+y。yaml文件名将被扩展后的参数替换:

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

现在你已经设置好了;您可以按enter键,或者像其他命令行一样添加参数。


指出:

  • 在你的例子中只支持yaml子集。
  • 您可以在函数中添加更多yaml解析,可能是yq
  • 在这个版本中,光标必须在yaml文件名旁边-否则words中的最后一个值将为空。您可以添加代码来检测这种情况,然后用compset -n更改words数组。
  • compaddcompset的描述见zshcompwid手册页。
  • zshcompsyscompdef的详细信息;自动加载文件一节描述了另一种部署方式。

相关内容

  • 没有找到相关文章

最新更新