【问题标题】:process.exit(0): output disappears?process.exit(0):输出消失?
【发布时间】:2023-04-03 05:20:02
【问题描述】:

Emacs lisp 命令调用node hello.js:

(call-process "node" nil t nil "hello.js")

hello.js 的两种变体:

  • hello_1.js:

    console.log('Hello world!');
    

    输出:

    Hello world!
    0
    
  • hello_2.js:

    console.log('Hello world!');
    process.exit(5);
    

    输出(日志语句没有输出!):

    5
    

process.exit(5) 导致输出被抑制的原因是什么?

注意事项:

  • 我在GNU Emacs 24.3.1 (i386-mingw-nt5.1.2600) 中遇到了这个问题 2013-03-17 在 MARVIN 上结合 Node.js v0.10.18,运行于 Windows XP/SP3/32。

  • 我试过EShell执行节点命令行:无输出

  • process.exit()调用低级process.reallyExit(),导致问题: 没有输出

    process.reallyExit() 是用 C++ 实现的:

    void Exit(const FunctionCallbackInfo<Value>& args) {
      HandleScope scope(node_isolate);
      exit(args[0]->IntegerValue());
    }
    

    [...]

    NODE_SET_METHOD(process, "reallyExit", Exit);
    

【问题讨论】:

  • node -p "console.warn('Hello World!!');process.exit(0);" 在我的 Ubuntu 12.04(Emacs 24.2)的 eshell 中输出 "Hello World!!"。

标签: windows node.js emacs elisp


【解决方案1】:

呸,我自己想通了。首先,我发现延迟会导致 出现的输出:

hello_3.js:

console.log('Hello world!');
setTimeout(function () {
    process.exit(5);
}, 1000);

输出:

Hello world!
5

所以我仔细检查了 console 和 found 的 Node.js 文档:

当目的地是一个终端或一个终端时,控制台功能是同步的 文件(以避免在过早退出的情况下丢失消息)和异步时 这是一个管道(以避免长时间阻塞)。

然后我决定确保不使用管道并编写了一个批处理脚本 hello_2.bat:

@ECHO OFF
node hello_2.js >test
TYPE test

使用(call-process "cmd.exe" nil t nil "/C" "hello_2.bat")调用脚本时的输出:

Hello world!
0

(返回值是0而不是5,但我不在乎)

回答我的问题:

  1. 看起来 Windows 上的 Emacs 中的 call-process 使用管道来检索 程序的输出。

    正如我也提到过 EShell:它似乎不被认为是 Windows 上的 Node.js 终端,并且可能 EShell 在内部使用 call-process 或 类似于运行程序。

  2. 检测到管道作为标准输出的目标导致console.log 异步运行。

  3. Windows 上 Node.js 中的process.exit(5) 似乎丢弃了所有预定的 异步任务,因此不会产生任何输出。

    这个假设得到了拼命将输出定向到 Windows 命令提示符内的管道:

    C:\Temp> node hello_2.js | MORE
    
    C:\Temp>
    

最后,我发现问题是 known 大约一年前(截至 2013 年 9 月)。

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2014-02-07
    • 2017-08-26
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多