mac上R是怎么执行起来的(对shell的考察)?
目的
我有两个版本的R, 3.6和4.0. 通过R
命令我能执行的是4.0, 我希望能通过R3.6
也能执行3.6的. 为此, 我需要考察在执行R
的时候, 发生了什么.
略去过程, 直接说结论.
总结发现
- 执行R其实是执行一个shell脚本, 这个脚本主要干了这些事:
- 设置了一些环境变量, 最重要的是
R_HOME_DIR
(R_HOME=${R_HOME_DIR}
), 其它一些环境变量, 比如下面提到的R_HOME_DIR
都是依赖R_HOME
的. 而R_HOME=/Library/Frameworks/R.framework/Resources
- 启动
R_binary=" ${R_HOME}/bin/exec$ {R_ARCH}/R"
. 但如果不经过这个R shell脚本执行是会出错的, 因为它依赖一堆环境变量(之后会说到).
- 设置了一些环境变量, 最重要的是
- 刚刚说
R_HOME
的这个路径/Library/Frameworks/R.framework/Resources
, 其实是一个symlink, 它直接指向的是/Library/Frameworks/R.framework/Versions/Current
, 而后者也就是/Library/Frameworks/R.framework/Versions/Current
也是一个symlink, 指向的是/Library/Frameworks/R.framework/Versions/4.0/Resouces
. - 不同版本的R在
/Library/Frameworks/R.framework/Versions
下, 对每个R, 真实的home目录都是其下(比如Versions/3.6
)的Resources
文件夹. - 3.6和4.0的
Resources/bin/R
两个文件完全相同. R怎么做到更新中, 能进行最小的改动的, 答案就是symlink. /usr/local/bin/R
是个symlink, 指向Resources
文件夹下的R, 后者也是symlink, 指向的是home目录下bin目录的R.
如何才能自由地在3.6与4.0中穿梭呢(虽然我很可能并不需要3.6)?
很简单. 我想只要再创建一个一模一样的shell脚本, 再改一下R_HOME
的路径, 从R_HOME=/Library/Frameworks/R.framework/Resources
指向/Library/Frameworks/R.framework/Versions/3.6/Resouces
就可以了. 于是我拷贝了R shell脚本到/usr/local/bin/下, 起名叫3.6
仅仅只有这些行不一样:
R_HOME_DIR=/Library/Frameworks/R.framework/Versions/3.6/Resources
R_SHARE_DIR=${R_HOME}/share # 其实这是等价的, 之前的脚本用的是绝对路径, 我觉得这种写法很丑陋
R_INCLUDE_DIR=${R_HOME}/include # 同上
R_DOC_DIR=${R_HOME}/doc # 同上
然后我就也能使用R3.6了(虽然并没有什么用..).