nodejs child_process.spawnSync 或 child_process.spawn 包裹在 yieldable 生成器中,它返回输出

Posted

技术标签:

【中文标题】nodejs child_process.spawnSync 或 child_process.spawn 包裹在 yieldable 生成器中,它返回输出【英文标题】:nodejs child_process.spawnSync or child_process.spawn wrapped in yieldable generator which returns output 【发布时间】:2015-11-30 07:53:03 【问题描述】:

有一段时间以来,我一直在尝试做一些到目前为止对我来说并不奏效的事情。

使用 nodejs,我喜欢运行交互式 sh-command,并在命令退出后使用 sh-command 输出。我喜欢编写一个可生成的生成器函数,它包装交互式 shell 命令的运行并返回 shell 命令的输出。

方法一:shelljs

shelljs 我在 shelljs 方面取得了一些成功,但在某些时候它不会进一步运行。 问题1:是否有可能让shelljs达到我可以继承stdio并使shelljs函数可屈服的程度?

方法 2:child_process.spawnSync

child_process.spawnSync 最后我发现了 child_process.spawnSync 并且很高兴,至少我可以运行交互式 sh-commands 而不会出现options: stdio: 'inherit' 的问题 但我还没有找到如何取回 child_process.spawnSync 的输出。 问题 2:如何将 spawnSync 包装到返回 child_process 输出的生成器函数中?

方法3:协同子进程

我也试过co-child-process。 它似乎可以运行,但不能与 stdio 交互。关于这个有一个issue,我不太明白。 问题 3:谁能解释我/发布一个示例 co-child-process 将如何与 stdio 继承一起工作。

方法 4:promisify child_process.spawn() 与 bluebird

如果 child_process.spawn() 是可承诺的,我在 bluebird 上打开了 issue

所以我的问题。有人可以给我发一个如何运行交互式 shell 命令的示例,该命令可以包装在返回 shell 命令输出的可生成生成器函数中吗?我对新方法持开放态度。

我创建了一个 npm 模块,该模块可在 github 上找到,您可以在其中 fork 并做出贡献。

提前谢谢。

【问题讨论】:

从问题中不清楚您到底想要产生什么。只是 spawn 命令?或者您想为进程 stdin/stdout 生成读/写命令?您能描述一下您要解决的最初问题吗? 我喜欢产生 spawn 命令并获得所有可能发生的输出。我原来的问题如下。我尝试串行运行不同的交互式 shell 命令。后面的命令可能取决于前面命令的结果(输出),所以我需要前面的输出。 如果你想要交互性,你不能得到所有的输出。您将不得不发送单独的读/写命令。此外,在为您提供下一个输出块而不是等待输入时,该过程可能会停止,并且没有确定区分这两种状态的方法。简而言之,我认为您无法在一般情况下解决您的产量问题(如果您分享有关您尝试控制的具体过程及其输出的更多信息,您的具体情况可能是可以解决的) 另见:github.com/chjj/pty.js,这是一个比 child_process 更好的起点,因为它可以模拟交互式终端的行为。编辑:我想我明白你想要做什么 - 你想在你自己的程序中包含另一个程序的交互式会话吗? 【参考方案1】:

我发现以下适用于 v5.4.1 。在文档NodeJS Child Process 中,它提到了选项encoding,它的默认值为'buffer'。如果您将此选项设置为 'utf8',那么您将得到一个带有结果的字符串,而不是缓冲区。您可以从 spawnSync 获取一个字符串,因为它是同步的并且会阻止执行,直到命令完成。这是一个执行“ls -l /usr”命令并将输出作为字符串对象获取的脚本的工作示例:

#!/usr/bin/env node

var cp = require('child_process');

var ls = cp.spawnSync('ls', ['-l', '/usr'],  encoding : 'utf8' );
// uncomment the following if you want to see everything returned by the spawnSync command
// console.log('ls: ' , ls);
console.log('stdout here: \n' + ls.stdout);

当你运行它时,你会得到以下信息:

stdout here:
total 68
drwxr-xr-x   2 root root 36864 Jan 20 11:47 bin
drwxr-xr-x   2 root root  4096 Apr 10  2014 games
drwxr-xr-x  34 root root  4096 Jan 20 11:47 include
drwxr-xr-x  60 root root  4096 Jan 20 11:47 lib
drwxr-xr-x  10 root root  4096 Jan  4 20:54 local
drwxr-xr-x   2 root root  4096 Jan  6 01:30 sbin
drwxr-xr-x 110 root root  4096 Jan 20 11:47 share
drwxr-xr-x   6 root root  4096 Jan  6 00:34 src

文档告诉您除了 stdout 之外,您还可以从对象上获得什么。如果您想查看返回对象的所有属性,请取消注释 console.log(警告:有很多东西 :))。

【讨论】:

以上是关于nodejs child_process.spawnSync 或 child_process.spawn 包裹在 yieldable 生成器中,它返回输出的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs动态加载路由,Nodejs遍历目录,Nodejs路由工具

nodejs最大内存

Nodejs:nodejs 中的 Kineticjs

windows怎么安装nodejs

Nodejs - 如何在 ubuntu 中卸载旧版本的 nodejs 并安装新版本的 nodejs

如何解决nodejs安装错误