首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >eval `opam config env‘或eval $(opam env)的用途是什么?它们之间的区别是什么?

eval `opam config env‘或eval $(opam env)的用途是什么?它们之间的区别是什么?
EN

Stack Overflow用户
提问于 2015-05-10 19:48:48
回答 1查看 4.7K关注 0票数 5

安装opam之后,它要求

代码语言:javascript
复制
eval `opam config env`

它的确切用途是什么?

赏金:在哪里运行eval $(opam env)

什么时候应该运行eval $(opam env)

在奥帕姆迷幻剂之后?在开关启动之前?例如,如果我有:

代码语言:javascript
复制
conda install -c conda-forge opam
opam init

# - install coq: see 
opam switch create debug_proj_4.09.1 4.09.1
opam switch debug_proj_4.09.1
opam repo add coq-released https://coq.inria.fr/opam/released
# install the right version of coq and pins it to it so that future opam installs don't change the coq version
opam pin add coq 8.11.0

我把eval $(opam env)放在哪里?

EN

回答 1

Stack Overflow用户

发布于 2022-06-08 15:34:05

tldr:它根据当前的开关激活您的opam上下文--类似于python中激活python虚拟env的方式,但对于opam.则是如此。

eval $(opam env)所做的是计算opam env命令的结果。(在这里,$( )是命令替换)。命令替换通常用于计算bash中命令的输出。在python中,eval会将输入字符串解释为用于计算、解析和在这里运行的文本python代码,类似地,它也会这样做,但假设它是bash (据我猜测)。

opam env是做什么的?它返回当前开关的当前bash变量(即开关大约等于opam环境)。因此,我们要做:

代码语言:javascript
复制
eval $(opam env)

这是:

  1. 首先在子subshell中运行,因为这是$(cmd)所做的。这是命令替代。通常用于嵌套命令。
  2. 然后给出它的输出($(opam env)的输出字符串)给evalopam env返回“激活:当前opam”所需的env变量字符串(类似于python中激活虚拟env的方式)。
  3. 最后,eval计算它从命令替换中收到的字符串,即它将字符串解析为bash命令并运行它。

完整性请参见opam env的输出

代码语言:javascript
复制
(iit_synthesis) brandomiranda~ ❯ opam env
OPAM_SWITCH_PREFIX='/Users/brandomiranda/.opam/4.12.1'; export OPAM_SWITCH_PREFIX;
CAML_LD_LIBRARY_PATH='/Users/brandomiranda/.opam/4.12.1/lib/stublibs:/Users/brandomiranda/.opam/4.12.1/lib/ocaml/stublibs:/Users/brandomiranda/.opam/4.12.1/lib/ocaml'; export CAML_LD_LIBRARY_PATH;
OCAML_TOPLEVEL_PATH='/Users/brandomiranda/.opam/4.12.1/lib/toplevel'; export OCAML_TOPLEVEL_PATH;
PATH='/Users/brandomiranda/.opam/4.12.1/bin:/Users/brandomiranda/miniconda/envs/iit_synthesis/bin:/Users/brandomiranda/miniconda/condabin:/usr/local/bin:/Users/brandomiranda/.opam/4.12.1/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin'; export PATH;

当前猜测安装顺序是什么(在dockerfile中):

代码语言:javascript
复制
# - setp up opam
#RUN conda install -c conda-forge opam
RUN opam init --disable-sandboxing
RUN opam switch create debug_proj_4.09.1 4.09.1
RUN opam switch debug_proj_4.09.1
# RUN eval $(opam env)
RUN opam repo add coq-released https://coq.inria.fr/opam/released
RUN opam pin add -y coq 8.11.0
RUN opam install -y coq-serapi
RUN eval $(opam env)

# Don't think it should work since dockerfiles are not suppose to be editable. Need to run this every time you log?
# makes sure depedencies are installed once already in the docker image
RUN pip install pycoq

关于向后滴答的评论:

请注意:在eval之后,opam env周围显示的背面滴答是必不可少的。它们改变应用程序的顺序,这是非常重要的。后面的代码告诉系统首先计算opam env (它返回一个命令字符串),然后eval在字符串中执行这些命令。执行它们不会返回任何内容,但是它会在幕后初始化Opam环境。参考文献:https://ocaml.org/docs/up-and-running

另见:

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30155960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档