Я хочу иметь возможность беспрепятственно печатать выходные данные неизвестной (определенной пользователем) команды в go, передаваемой через io.ReadCloser.Bufio.NewScanner считывает стандартный вывод и правильно печатает текст, однако цвет, который печатает дочерний процесс, не записывается и не передается через канал (или я не знаю, как получить к нему доступ).
Iпопытался использовать execErr := syscall.Exec(binary, cmd.Args, os.Environ())
однако, так как это берет на себя процесс go, я не могу получить массив процессов для запуска.
// SpawnGroup spawns a group of processes
func SpawnGroup(cmds []*exec.Cmd) {
spawnWg := &sync.WaitGroup{}
spawnWg.Add(len(cmds))
defer spawnWg.Wait()
for _, cmd := range cmds {
go Spawn(cmd, spawnWg)
}
}
// Spawn spawn a child process
func Spawn(cmd *exec.Cmd, wg *sync.WaitGroup) {
defer wg.Done()
stdout, _ := cmd.StdoutPipe()
stderr, _ := cmd.StderrPipe()
err := cmd.Start()
if err != nil {
color.Red(err.Error())
}
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
errScanner := bufio.NewScanner(stderr)
for errScanner.Scan() {
color.Red(scanner.Text())
}
cmd.Wait()
}
Например, если я попытаюсь запустить две команды, переданные в массиве, такие как sls offline
и vue-cli-service serve
, все будет работать так, как ожидается, но записанный вывод не будет иметь цвет.Оба эти процесса печатают часть своего вывода в командной строке с цветом.Точный массив команд будет неизвестен, поэтому мне нужен способ распечатать точный вывод из них.
Мне удалось заставить это работать в узле с помощью:
let cmd = await spawn(command, args, {
stdio: 'inherit',
shell: true,
...options
});
Я не смог отследить, как это сделать на ходу.
Спасибо за любой совет или помощь, это мое первое настоящее погружение в жизнь, но, похоже, это отличный язык!