Я знаю, что могу передать 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 (представьте прогресс%, который увеличивается), я не вижу, чтобы это обновление происходило в реальном времени. Я вижу только конечный результат.