Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从Node.js运行shell命令而不缓冲输出大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从Node.js启动sHell命令,而不重定向该命令的输入和输出 – 就像使用sHell脚本sHell命令或使用Ruby的系统命令。如果子进程想要写入STDOUT,我想要直接到控制台(或获得重定向,如果我的Node应用程序的输出重定向)。

节点似乎没有任何直接的方法来做到这一点。看起来像运行另一个进程的唯一方法是使用child_process,它总是将子进程的输入和输出重定向到管道。我可以编写代码接受来自这些管道的数据,并将其写入我的进程的STDOUT和STDERR,但如果我这样做,API迫使我牺牲一些灵活性。

我想要两个功能

> SHell语法。我想能够在命令之间输出管道,或者运行Windows批处理文件
>无限输出。如果我正在对编译器进行sHell操作,并且想要生成兆字节的编译器警告,我希望它们都能在屏幕上滚动(直到用户感到厌烦,并击中Ctrl C)

看起来Node想强迫我在这两个特性之间进行选择。

>如果我想要无限量的输出,我可以使用child_process.spawn然后做child.stdout.on(‘data’,function(data){process.stdout.write(data);});和stderr同样的事情,它会很高兴地管道数据,直到牛回家。不幸的是,spawn不支持sHell语法。
>如果我想要sHell语法,我可以使用child_process.exec.但exec坚持缓冲子进程的STDOUT和STDERR为我,并给他们所有在结束,它限制了这些缓冲区的大小(可配置,认200K) 。我仍然可以挂钩on(‘data’)事件,如果我想看到输出生成,但exec仍然会将数据添加到其缓冲区。当数据量超过预定义的缓冲区大小时,exec将终止子进程。

(还有child_process.execFile,从灵活性的角度来看,这是两个世界中最糟糕的:没有sHell语法,但是你仍然需要限制你期望的输出量。)

我缺少什么?有没有什么办法只是外壳到Node中的子进程,而不是重定向其输入和输出?某些支持sHell语法,并且在预定义的输出量后不会崩溃,就像在sHell脚本,Ruby等中可用的?

解决方法

您可以通过spawn参数继承stdin / out /错误流,因此您不需要手动管道:

var spawn = require('child_process').spawn;
spawn('ls',[],{ stdio: 'inherit' });

使用sHell作为sHell语法 – 对于bash,它是-c参数从字符串中读取脚本:

var spawn = require('child_process').spawn;
var sHellSyntaxCommand = 'ls -l | grep test | wc -c';
spawn('sh',['-c',sHellSyntaxCommand],{ stdio: 'inherit' });

总结:

var spawn = require('child_process').spawn;
function shspawn(command) {
   spawn('sh',command],{ stdio: 'inherit' });
} 

shspawn('ls -l | grep test | wc -c');

大佬总结

以上是大佬教程为你收集整理的从Node.js运行shell命令而不缓冲输出全部内容,希望文章能够帮你解决从Node.js运行shell命令而不缓冲输出所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。