基本上是foo(**bar)
在python中的作用,这里我想要的是
foo **bar.yaml
变成
foo --bar1=1 --bar2=2
其中bar.yaml
为
bar1: 1
bar2: 2
您可以使用sed
和xargs
的组合:
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'
在zsh
shell提示符下,输入命令和yaml文件名:
% print -l -- ./bar.yaml▃
将光标放在yaml文件名的后面,按ctrl+y。yaml文件名将被扩展后的参数替换:
% print -l -- --bar1='1' --bar2='2' ▃
现在你已经设置好了;您可以按enter键,或者像其他命令行一样添加参数。
指出:
- 在你的例子中只支持
yaml
子集。 - 您可以在函数中添加更多
yaml
解析,可能是yq
。 - 在这个版本中,光标必须在
yaml
文件名旁边-否则words
中的最后一个值将为空。您可以添加代码来检测这种情况,然后用compset -n
更改words
数组。 compadd
和compset
的描述见zshcompwid
手册页。zshcompsys
有compdef
的详细信息;自动加载文件一节描述了另一种部署方式。