【问题标题】:How to share data between Ruby and Bash through the YAML?如何通过 YAML 在 Ruby 和 Bash 之间共享数据?
【发布时间】:2011-08-28 20:34:53
【问题描述】:

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

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

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

【问题讨论】:

  • 什么样的数据?从 Bash 中使用 Yaml 听起来一点也不好玩,但如果你的结构相当简单,也许它是可行的。
  • Ruby 程序是一个命令行工具。 Bash 脚本是一个文件,存储在 /etc/bash_completion.d/foo 中。我想使用 YAML 来存储 Ruby 程序的命令行选项。为什么我需要这个?我认为 YAML 将是在两个程序之间共享命令行选项的便捷方式(DRY 原则或其他)。所以,基本上,Bash 脚本是一个用于自动完成的脚本。我不想两次(在两个程序中)编写相同的选项,而 foo.yml 应该可以帮助我。
  • 为什么不直接根据你的 YAML 文件生成自动补全配置呢?选项不会一直在变化,那么为什么还要尝试使自动完成配置动态化呢?
  • 为什么?我不知道:)“生成”是什么意思?目前我既没有 foo.yml,也没有 baz.sh 文件。我只是想知道什么是正确的方法。
  • 为您的 Ruby 脚本创建一个选项,以改为从其内部数据库输出 Bash 自动完成脚本。

标签: ruby bash yaml


【解决方案1】:

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

我建议从 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

}

注意:以上脚本未经测试,仅为示例

【讨论】:

  • 好吧,谢谢,但我最终得到了命令行 Ruby 实用程序的“帮助”命令的正则表达式解析。为什么?因为每个人都这样做,所以看起来很自然。还有 YAML……也许,这是一个矫枉过正的决定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
相关资源
最近更新 更多