Как обмениваться данными между Ruby и Bash через YAML? - PullRequest
1 голос
/ 29 августа 2011

Прежде всего, мне нужно использовать одну и ту же информацию между скриптами Ruby и Bash.

Я никогда этого не делал, и никогда не использовал YAML. Почему я думаю о YAML, это то, что Ruby имеет довольно хорошую поддержку из стандартной библиотеки. Проблема в том, что я не могу найти информацию о взаимодействии Bash и YAML. Я хочу написать какой-нибудь файл YAML (скажем, foo.yml) и использовать его содержимое в обоих скриптах: bar.rb и baz.sh.

Может быть, использование YAML там не так? Каков наиболее правильный способ обмена данными между программами?

1 Ответ

1 голос
/ 12 сентября 2011

YAML поддерживает сложные структуры данных, которые не поддерживаются bash. Первый пример, который приходит на ум - это ассоциативные массивы.

Я бы предложил генерировать соответствующие структуры данных из Ruby и использовать их в bash.

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

Вывод скрипта ruby ​​при вызове с --generate-complete-data должен быть допустимым скриптом 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

}

Примечание: приведенный выше скрипт не тестируется, это всего лишь пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...