Передавать вывод дочернего процесса в окно терминала, а также записывать в переменной - PullRequest
2 голосов
/ 14 июля 2020

Я знаю, что могу передать stdout и stderr дочернего процесса на терминал, передав параметр { stdio: 'inherit' }, т.е.

child_process.spawnSync('echo', ['hello'], { stdio: 'inherit' })

И я знаю, что могу вместо этого зафиксируйте его в переменной, опуская эту опцию:

const child = child_process.spawnSync('echo', ['hello'], { stdio: 'inherit' })
const output = child.stdout.toString()

Но что, если я хочу оба пропускать поток вывода на терминал и зафиксировать вывод в переменной? Мое текущее решение выглядит так:

const child = spawn('echo', ['hello'])
child.stdout.pipe(process.stdout)
child.stderr.pipe(process.stderr)

let stdout = ''
let stderr = ''

child.stdout.on('data', buffer => {
  stdout += buffer.toString()
})

child.stderr.on('data', buffer => {
  stderr += buffer.toString()
})

child.stdout.on('close', buffer => {
  console.log('captured stdout', stdout)
})

child.stderr.on('close', buffer => {
  console.log('captured stderr', stderr)
})

Но подход pipe не работает так же идеально, как { stdio: inherit }. Если выполняемая команда обновляет существующую строку stdout (представьте прогресс%, который увеличивается), я не вижу, чтобы это обновление происходило в реальном времени. Я вижу только конечный результат.

...