一般有没有办法将配置文件解压缩到 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
您可以使用 sed
和 xargs
的组合:
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
数组
compadd
和 compset
在 zshcompwid
手册页中有描述。
zshcompsys
有关于 compdef
的详细信息;关于自动加载文件的部分描述了另一种部署此类内容的方法。
基本上是 foo(**bar)
在 python 中的作用,在这里我想要类似
foo **bar.yaml
那会变成
foo --bar1=1 --bar2=2
bar.yaml
的位置
bar1: 1
bar2: 2
您可以使用 sed
和 xargs
的组合:
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
. 更改 compadd
和compset
在zshcompwid
手册页中有描述。zshcompsys
有关于compdef
的详细信息;关于自动加载文件的部分描述了另一种部署此类内容的方法。
words
数组