16

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

使用 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 命令而不会出现问题options: { stdio: 'inherit' }
  • 但我还没有找到如何取回 child_process.spawnSync 的输出。
  • 问题 2:如何将 spawnSync 包装到返回 child_process 输出的生成器函数中?

方法3:协同子进程

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

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

  • 如果 child_process.spawn() 是可承诺的,我在 bluebird 上打开了一个问题

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

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

提前谢谢。

4

1 回答 1

29

我发现以下适用于 v5.4.1 。在文档NodeJS Child Process中,它提到了默认为'buffer'的选项encoding。如果您将此选项设置为'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(警告:有很多东西:))。

于 2016-01-20T19:55:42.420 回答