Как вы получаете цвет вывода из exec.StdoutPipe ()? - PullRequest
0 голосов
/ 22 сентября 2019

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

Я не смог отследить, как это сделать на ходу.

Спасибо за любой совет или помощь, это мое первое настоящее погружение в жизнь, но, похоже, это отличный язык!

1 Ответ

0 голосов
/ 23 сентября 2019

Изменение кода вызова для присвоения os.Stdout для cmd.Stdout позволил выводу печатать правильные цвета.

func Spawn(cmd *exec.Cmd, wg *sync.WaitGroup) {
    defer wg.Done()
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    err := cmd.Start()
    if err != nil {
        color.Red(err.Error())
    }
    defer cmd.Wait()
}```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...