如何通过YAML在Ruby和Bash之间共享数据?

时间:2011-08-28 20:34:53

标签: ruby bash yaml

首先,我需要在Ruby和Bash脚本之间使用相同的信息。

我从未这样做过,或者从未使用过YAML。为什么我会想到YAML,Ruby是否从标准库中得到了相当好的支持。问题是我找不到任何有关Bash和YAML交互的信息。我想写一些YAML文件(比如说,foo.yml)并在两个脚本中使用它的内容:bar.rb和baz.sh。

也许YAML的用法有误吗?在程序之间共享数据的最正确方法是什么?

1 个答案:

答案 0 :(得分:1)

YAML支持bash不支持的复杂数据结构。想到的第一个例子是Associative Arrays。

我建议从Ruby生成适当的数据结构,并在bash中使用它们。

. <(/path/to/your/ruby/script --generate-completion-data)

使用--generate-completion-data调用ruby脚本的输出应该是一个有效的bash脚本,定义将在完成脚本/过程中使用的变量

例如:

CMD_OPTS=(--help --print --version)
CMD_F_OPTS=(--audio --video)

您的完成脚本可能如下所示:

. <(/path/to/your/ruby/script --generate-completion-data)

__is_file_opt {
    for element in ${CMD_F_OPTS[*]};
        if [[ $1 == $element ]]; then 
            return 0;
        fi
    done
    return 1;
}
__ruby_script_complete {
    local cur prev
    COMPREPLY=()

    #_get_cword  is a function defined by /etc/bash_completion in Ubuntu, returns 
    # the current word to complete may not be available in your version
    cur=`_get_cword` 

    prev=${COMP_WORDS[COMP_CWORD-1]}

    if [[ "$cur" == -* ]]; then
        COMPREPLY=($( compgen -W "${CMD_OPTS[*]} ${CMD_F_OPTS[*]}" -- "$cur" ))               
        return 0;
    fi

    if __is_file_opt $prev; then
        COMPREPLY=( $( compgen -f -- $cur ) \
                    $( compgen -d -- $cur ) )
    fi
    return 0

}

注意:上面的脚本没有经过测试,只是一个例子