【问题标题】:Node.js pass text as stdin of `spawnSync`Node.js 将文本作为 `spawnSync` 的标准输入传递
【发布时间】:2017-12-07 01:54:45
【问题描述】:

我认为这很简单,但以下内容无法按预期工作。

我想将数据从 Node 传送到一个进程,例如(只是一个任意命令)wc

docs 和其他 SO questions 似乎表明传递 Stream 应该可以工作:

const {spawnSync} = require('child_process')
const {Readable} = require('stream')

const textStream = new Readable()
textStream.push("one two three")
textStream.push(null)

const stdio = [textStream, process.stdout, process.stderr]
spawnSync('wc', ["-c"], { stdio })

不幸的是,这会引发错误:

选项“stdio”的值“Readable { ... } 无效

relevant bit of code from internal/child_process.js 不会立即透露预期的有效选项是什么。

【问题讨论】:

  • 这很有趣!我只是通过将数据直接传递给input 选项而不是重新分配stdin 来使其工作。
  • “请注意,流必须具有底层描述符”。我不认为你的textStream 有一个。
  • 谢谢@robertklep——我也注意到了;从我读过的所有内容来看,不清楚为什么需要描述符,它是如何实现/与常规流区分开来的,或者在任何情况下如何解决它。这是一个奇怪的、看似武断的要求。
  • 这不是任意的,因为这就是管道(基本上是您要构建的)的工作方式:它们连接文件描述符。但是,将数据管道传输到进程和spawnSync 的组合也没有任何意义,因为外部程序是同步执行的(因此在它开始和结束之间你不能通过管道传输任何东西)。也许您想使用input 选项?
  • 谢谢@robertklep——input 选项在这里看起来是正确的答案。另外:正确的解决方案应该是恕我直言,stdio[0] 应该在抽象流接口的任何兼容实现上都有效;无论是来自套接字、文件、管道还是任何其他可读接口; spawn 的同步性是一个 wait 用于 spawn 退出 - 但这不会抑制生成的进程,例如从标准输入永远读取。对带有描述符的流的限制似乎是一个任意的技术警告,而不是服务于合理目标的原则性设计选择。可能是错的:)

标签: node.js node-streams


【解决方案1】:

要将特定数据显示为子进程的stdin 数据,您可以使用input 选项:

spawnSync('wc', ['-c'], { input : 'one two three' })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多