我试图从Node.js启动shell命令,没有重定向该命令的输入和输出 - 就像使用shell脚本对命令进行脱壳一样,或者使用Ruby的system
命令。如果子进程想要写入STDOUT,我希望直接进入控制台(或者如果我的Node应用程序的输出被重定向,那么会被重定向)。从Node.js运行没有缓冲输出的shell命令
节点似乎没有任何直接的方法来做到这一点。看起来运行另一个进程的唯一方法是使用child_process
,其中总是将子进程的输入和输出重定向到管道。我可以编写代码来接受来自这些管道的数据并将其写入到我的进程的STDOUT和STDERR,但是如果我这样做,这些API迫使我牺牲一些灵活性。
我想两个特点:
- shell语法。我希望能够在命令之间输出输出,或者运行Windows批处理文件。
- 无限输出。如果我正在向编译器发出警告,并且想要生成兆字节的编译器警告,我希望它们全部在屏幕上滚动(直到用户厌倦它并点击Ctrl + C)。
它看起来像节点希望强迫我在这两个功能之间进行选择。
- 如果我想输出无限量的,我可以用
child_process.spawn
,然后stderr
做child.stdout.on('data', function(data) { process.stdout.write(data); });
,同样的事情,它会高兴地管道的数据,直到母牛回家。不幸的是,spawn
不支持shell语法。 - 如果我想要shell语法,我可以使用
child_process.exec
。但exec
坚持为我缓冲子进程的STDOUT和STDERR,并最终将它们全部提供给我,并限制这些缓冲区的大小(可配置,默认为200K)。如果我想查看产生的输出,我仍然可以挂接on('data')
事件,但exec
仍然会将数据添加到其缓冲区。当数据量超过预定义的缓冲区大小时,exec
将终止子进程。
(还有child_process.execFile
,这是从灵活性的角度来看两全其美的最坏:没有shell语法,但你还是要盖你期望的输出量)
我错过什么? 有没有什么办法可以将节点中的子进程掏空,并且而不是重定向它的输入和输出?支持shell语法的东西,并且在预定义的输出量之后不会出现,就像在shell脚本,Ruby等中可用的那样?
你有没有想过这个?我处于类似的情况。 – 2012-11-07 20:18:02
同样的问题,'直到奶牛回家'谢谢,为此,工作10小时后我的一天 – neric 2016-12-22 20:35:59