从 bash 变量为 Erlang erl 传递 -eval 失败

Posted

技术标签:

【中文标题】从 bash 变量为 Erlang erl 传递 -eval 失败【英文标题】:Passing -eval for Erlang erl from bash variable fails 【发布时间】:2016-11-27 03:19:36 【问题描述】:

我正在尝试从 bash 脚本启动 erl。当我从变量传递 eval 表达式内容时,erl 无法启动。当 eval 选项是直接 在 erl 命令行中给出,erl 启动时没有任何问题。 怎么办正确?

#!/bin/bash 
echo "-----------------------------------"
#
# Fails 
EVAL_EXP1="\"ok, observer:start(), ok\""
echo $EVAL_EXP1
erl -eval $EVAL_EXP1
#
# Fails 
echo "-----------------------------------"
EVAL_EXP2="ok, observer:start(), ok"
echo $EVAL_EXP2
erl -eval $EVAL_EXP2
#
# Works 
echo "-----------------------------------"
erl -eval "ok, observer:start(), ok"

脚本输出是

   13:30 $ ./start.sh 
   -----------------------------------
   "ok, observer:start(), ok"
   Crash dump is being written to: erl_crash.dump...done
   System process <0.0.0> terminated: function_clause,   
   [init,prepare_run_args,[eval,[<<"\"ok,">>,<<"observer:start(),">>,  
   <<"ok\"">>]],[],init,map,2,[],init,boot,1,[]]
   ./start.sh: line 7: 26573 Aborted     (core dumped) erl -eval $EVAL_EXP1
   -----------------------------------
   ok, observer:start(), ok
   (no error logger present) error: <0.0.0>

   Crash dump is being written to: erl_crash.dump...done
   System process <0.0.0> terminated: function_clause,  
   [init,prepare_run_args,[eval,[<<"ok,">>,<<"observer:start(),">>,
   <<"ok">>]],[],init,map,2,[],init,boot,1,[]]
   ./start.sh: line 13: 26599 Aborted                 (core dumped) erl -eval 
   $EVAL_EXP2
   -----------------------------------
   Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-threads:10]   
   [kernel-poll:false]

   Eshell V7.0  (abort with ^G)
   1> 

【问题讨论】:

使用传递给 erl 的多个 -eval 参数解决了我的目的。从类似的帖子***.com/questions/16871832/… 得到解决方案。仍然不确定为什么上述失败方法不起作用 【参考方案1】:

您需要将变量替换用引号括起来,以便将它们作为单个参数发送到erl

EVAL_EXP2="ok, observer:start(), ok"
erl -eval "$EVAL_EXP2"

【讨论】:

以上是关于从 bash 变量为 Erlang erl 传递 -eval 失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在erl中为单个标志设置多个命令行参数

Erlang:从命令行调用 erl -eval 永远不会退出

erlang 笔记(06/03/02)

ruby 将erlang_program.prompt.erl转换为ruby

原因:在 erl 控制台 [Erlang] 中运行常见测试时 undef

Erlang:当你在 erl 中 f() 一个 Pid 时会发生啥?