【问题标题】:Erlang escript: exception error: no match of right hand side value {error,enoent}‏Erlang escript:异常错误:右侧值不匹配 {error,enoent}‏
【发布时间】:2014-02-06 14:51:34
【问题描述】:

我在 Windows 7(64 位)上尝试使用 MinGW/MSYS 构建 Erlang RabbitMQ 插件时遇到了上述错误。我正在使用 Erlang v5.10.3(32 位)。我可以在我的系统上运行 RabbitMQ。

Fujitsu@Notebook /d/RabbitMQ/build-source/rabbitmq-public-umbrella/presence-exchange-master
$ make
[elided] generate deps
escript: exception error: no match of right hand side value {error,enoent}
  in function  generate_deps__escript__1389__793192__493000:detect_deps/5 (d:/RabbitMQ/build-source/rabbitmq-public-umbrella/generate_deps, line 40)
  in call from generate_deps__escript__1389__793192__493000:'-main/1-fun-0-'/6 (d:/RabbitMQ/build-source/rabbitmq-public-umbrella/generate_deps, line 19)
  in call from lists:foldl/3 (lists.erl, line 1248)
  in call from generate_deps__escript__1389__793192__493000:main/1 (d:/RabbitMQ/build-source/rabbitmq-public-umbrella/generate_deps, line 17)
  in call from escript:run/2 (escript.erl, line 747)
  in call from escript:start/1 (escript.erl, line 277)
  in call from init:start_it/1 (init.erl, line 1054)
  in call from init:start_em/1 (init.erl, line 1034)

我在 pastebin 上发布了完整的错误 - http://pastebin.com/S739wfhB generate_deps 的完整代码可以在这里找到 - http://pastebin.com/N4HVz8z1

附言。我也尝试过使用 CYGWIN,但它返回另一个错误 - escript: Failed to open file: /home/Fujitsu/rabbitmq/build-source/rabbitmq-public-umbrella/generate_deps

编辑 1

CYGWIN 返回:

$ make
[elided] generate deps
escript: Failed to open file: /cygdrive/d/RabbitMQ/build-source/rabbitmq-public-umbrella/generate_deps
[elided] generate deps
escript: Failed to open file: /cygdrive/d/RabbitMQ/build-source/rabbitmq-public-umbrella/generate_deps
make: *** No rule to make target 'build/deps.mk', needed by 'ebin/presence_exchange.beam'.  Stop.

但是,我可以使用 head 命令打开文件。

Fujitsu@Notebook /cygdrive/d/RabbitMQ/build-source/rabbitmq-public-umbrella/presence-exchange-master
$ head /cygdrive/d/RabbitMQ/build-source/rabbitmq-public-umbrella/generate_deps
#!/usr/bin/env escript
%% -*- erlang -*-
-mode(compile).

%% We expect the list of Erlang source and header files to arrive on
%% stdin, with the entries colon-separated.
main([TargetFile, EbinDir]) ->
    ErlsAndHrls = [ string:strip(S,left) ||
                      S <- string:tokens(io:get_line(""), ":\n")],
    ErlFiles = [F || F <- ErlsAndHrls, lists:suffix(".erl", F)],

【问题讨论】:

    标签: erlang erl


    【解决方案1】:

    这很可能是因为它找不到您要打开的文件,这就是 POSIX enoent 错误的含义。当您使用 cygwin 时,它会更加明确。 erlang badmatch 错误来自第 23 行:

    {ok, Hdl} = file:open(TargetFile, [write, delayed_write]),
    

    您尝试打开文件并匹配{ok, Hld} 的位置。但是file:open在找不到文件时返回{error,enoent},导致匹配失败并产生erlang错误。

    编辑:

    在我看来,问题在于它试图写入的文件。您可以在该目录中写入吗?如果文件已经存在,是否可以打开写入?

    【讨论】:

    • 谢谢,但我可以使用 head 命令打开文件。请参阅上面的编辑 1。可能是什么原因?
    • 您确定要打开同一个文件吗? head 也会打开文件进行读取,而在您的代码中您尝试打开文件进行写入。文件有哪些访问模式,是什么类型的文件?
    • 是的,它是同一个文件。 ls -l 返回“-rwxr-xr-x 1 Fujitsu None 2666 Jan 15 13:59 generate_deps”。我也试过 chmod 777。generate_deps 是某种 bash 文件,你可以在这里看到代码 - pastebin.com/N4HVz8z1
    猜你喜欢
    • 2020-10-08
    • 2015-12-06
    • 2019-02-27
    • 2016-05-05
    • 1970-01-01
    • 2016-02-16
    • 2014-06-27
    • 2014-04-12
    • 2021-04-03
    相关资源
    最近更新 更多