Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何从exec.StdoutPipe()获取输出的颜色?_Go - Fatal编程技术网

Go 如何从exec.StdoutPipe()获取输出的颜色?

Go 如何从exec.StdoutPipe()获取输出的颜色?,go,Go,我希望能够通过io.ReadCloser无缝打印go中未知用户定义的命令的输出。bufio.NewScanner读取std并正确打印文本,但是子进程打印的颜色没有记录并通过管道传递,或者我不知道如何访问它 我尝试使用execErr:=syscall.Execbinary、cmd.Args、os.Environ,但是由于这接管了go进程,所以我无法获得要运行的进程数组 // SpawnGroup spawns a group of processes func SpawnGroup(cmds []

我希望能够通过io.ReadCloser无缝打印go中未知用户定义的命令的输出。bufio.NewScanner读取std并正确打印文本,但是子进程打印的颜色没有记录并通过管道传递,或者我不知道如何访问它

我尝试使用execErr:=syscall.Execbinary、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 service,则所有命令都会按预期工作,但记录的输出没有颜色。这两个进程都使用颜色将部分输出打印到命令行。命令的确切数组未知,因此我需要一种方法来打印命令的确切输出

我可以通过以下方式在节点中实现此功能:

  let cmd = await spawn(command, args, {
    stdio: 'inherit',
    shell: true,
    ...options
  });
我还没能在围棋中找到如何做到这一点


谢谢你的建议和帮助,这是我第一次真正深入围棋,但它似乎是一门很棒的语言

更改spawn代码以将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()
}```

请看,如果没有连接到终端,这些命令可能不会生成彩色输出。Go中没有任何操作。Go不会随意去除颜色。如果看不到彩色输出,那是因为进程将其关闭。正如沃尔克所说,如果stdout不是终端运行sls离线(cat),那么这是正常的行为,您也会看到未着色的输出。将os.Stdout分配到命令的Stdout字段,以便将它们直接连接到终端。也有可能是一个国旗,迫使颜色被打开。我确实看了一眼minecraft的帖子。stackoverflow.com/questions/45117214/这没有帮助,因为在运行时该命令未知@Peter-我不是说go任意删除颜色,我是问如何通过go的io.ReadCloser传递已知进程的颜色,或者如何从进程传递十六进制颜色。@Peter,go执行的命令是动态的,由用户定义的。它可能是一个自定义脚本-go应用程序不可能知道使用什么标志来强制执行该脚本,我不希望为了让我的编排实用程序工作而强制用户传递一些额外的标志。我可以为一个os.Stdout分配多个命令吗?关于为什么这样做还有很多要说的。许多命令行程序检查stdout是否为终端,并在连接到终端时发出不同的输出,如颜色或转义码。这个解决方案的作用似乎是重用现有的stdout,这样命令就可以像从同一个终端运行一样运行。它可能不适用于所有情况,但它是一个非常简单和有用的解决方案。谢谢,蒂姆。