【问题标题】:How does RVM gets invoked while going into a folder with Gemfile?使用 Gemfile 进入文件夹时如何调用 RVM?
【发布时间】:2014-08-29 04:46:33
【问题描述】:

我很惊讶 RVM 是如何通过命令行导航到目录来切换 Ruby 版本来支持 Gemfile 的? RVM 是否通过 shell 收到回电?任何人都可以提供一个指针吗?

例如这样的消息:

RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does that too,
you can ignore these warnings with 'rvm rvmrc warning ignore /directory/path/to/Gemfile'.
To ignore the warning for all files run 'rvm rvmrc warning ignore allGemfiles'.

【问题讨论】:

    标签: ruby shell command-line rvm


    【解决方案1】:

    根据这篇文章:

    https://unix.stackexchange.com/questions/21363/execute-bash-scripts-on-entering-a-directory

    rvm 重新定义了 cd 命令。如果我按照 Amadan 的建议去做,我会得到:

    ~$ type cd
    cd is a function
    cd () 
    { 
        __zsh_like_cd cd "$@"
    }
    

    这看起来像是某种别名,所以让我们试试吧:

    ~$ type __zsh_like_cd
    __zsh_like_cd is a function
    __zsh_like_cd () 
    { 
        typeset __zsh_like_cd_hook;
        if builtin "$@"; then
            shift || true;
            for __zsh_like_cd_hook in chpwd "${chpwd_functions[@]}";
            do
                if typeset -f "$__zsh_like_cd_hook" > /dev/null 2>&1; then
                    "$__zsh_like_cd_hook" "$@" || break;
                fi;
            done;
            true;
        else
            return $?;
        fi
    }
    

    在 zsh shell 中,chpwd 是一个钩子函数,当当前目录更改时会调用它。但是,我不确定为什么它在不提供 chpwd 挂钩功能的 bash shell 中有效。阿马丹?

    【讨论】:

    • 它在bash 中不起作用,不像你想象的那样:) - chpwd 永远不会在bash 中执行。 for __zsh_like_cd_hook in chpwd "${chpwd_functions[@]}" 仅迭代 chpwd$chpwd_functions 中的任何内容,不执行任何内容。然后if typeset -f $__zsh_like_cd_hookchpwd 失败并且什么都不做。在我的机器上,它将接下来测试__rvm_cd_functions_set__rvm_after_cd,它们都确实存在,因此在下一行中执行(除非其中一个失败,从而中止循环)。
    • 但是重新定义这样一个基本命令值得推荐吗?链接到这样的回调的权限是如何处理的?以root权限运行的脚本可以修改zshrc吗?
    • @Amadan,我不知道为什么我的答案被接受了而不是你的——你是唯一知道这个线程发生了什么的人,所以 ++ 给你。
    • @7stud:哈哈,没关系。只要回答了这个问题,你就知道了。反正我有足够的代表:)
    • @JikkuJose:有些人不喜欢 RVM,特别是因为它的魔力;他们通常会改用rbenv 项目。但到目前为止,我从来没有遇到过任何麻烦,也没有听说过这样的人。没有链接是可能的,因为它是一个函数,而不是一个文件。以root身份运行的脚本确实可以修改.zshrc;它还可以擦除您的帐户或做任何它想做的事情,所以这是一个有争议的问题。这就像一个纵火犯在你的整个房子都被汽油浸透的情况下担心他是否可以在你的桌子上烧一张纸。
    【解决方案2】:

    通常cd 是一个内置的shell。 rvm 定义了被调用的 cd 函数。这样做自己看看:

    $ type cd
    

    然后在“干净”的 shell 中尝试一下,看看有什么不同:

    $ env -i PATH=$PATH HOME=$HOME bash -c "type cd"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      相关资源
      最近更新 更多