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);
输出(没有来自log语句的输出!):
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);
答案 0 :(得分:1)
hello_3.js
:
console.log('Hello world!');
setTimeout(function () {
process.exit(5);
}, 1000);
输出:
Hello world!
5
所以我仔细检查了console
和found的Node.js文档:
当目的地是终端或a时,控制台功能是同步的 文件(以避免在过早退出时丢失消息)和异步时 它是一个管道(以避免长时间阻塞)。
然后我决定确保没有使用管道并编写批处理脚本
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
异步运行。
process.exit(5)
似乎丢弃了所有预定的
异步任务,因此不会生成输出。
这种假设得到了拼命将输出指向a的结果的支持 Windows命令提示符内的管道:
C:\Temp> node hello_2.js | MORE
C:\Temp>
最后,我发现大约一年前(截至2013年9月)问题是known。