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)
导致输出被抑制的原因是什么?
笔记:
我遇到了MARVIN的2013-03-17的GNU Emacs 24.3.1(i386-mingw-nt5.1.2600)和在Windows XP / SP3 / 32上运行的Node.js v0.10.18的问题 。
我尝试了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);
唷,我自己想清楚了。 首先,我发现延迟会导致输出显示:
hello_3.js
:
console.log('Hello world!'); setTimeout(function () { process.exit(5); }, 1000);
输出:
Hello world! 5
所以我再次检查console
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,但我不在乎)
回答我的问题:
它看起来像在Windows上的Emacs中的call-process
使用管道来检索程序的输出。
正如我之前提到的,EShell:它似乎并不被Windows上的Node.js识别为终端,可能EShell内部使用call-process
或类似的方式来运行程序。
将管道检测为标准输出的目标将导致console.log
异步运行。
Windows中的Node.js中的process.exit(5)
似乎放弃了所有预定的异步任务,因此不会生成输出。
在Windows命令提示符下拼命地将输出指向管道的结果支持这种假设:
C:\Temp> node hello_2.js | MORE C:\Temp>
最后,我发现从大约一年前(截至2013年9月)就已经知道这个问题。