当前位置: 首页 > 面试题库 >

运行命令并使输出在线

封弘伟
2023-03-14
问题内容

我使用以下有效的代码,问题是输出与进程完成执行时一样被打印,我想将输出实时打印到屏幕上,而在进程完成时不提供所有输出,我该如何实现?

cmdParams := [][]string{
    {filepath.Join(dir,path), "npm", "install"},
    {filepath.Join(pdir,n.path), "gulp"},
}

for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]
    // Wait to finish, get output:
    out, err := cmd.Output()
    if err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Println("Finished %s, output: %s", cp[1:], out)
}

*尝试提出的解决方案时 *更新 ,我得到的输出像

2018/02/18 11:11:57  Starting [npm install] in folder ...
2018/02/18 11:12:14 adde
2018/02/18 11:12:14 d 56
2018/02/18 11:12:14 3 pa
2018/02/18 11:12:14 ckag
2018/02/18 11:12:14 es i
2018/02/18 11:12:14 n 15
2018/02/18 11:12:14 .477
2018/02/18 11:12:14 s
2018/02/18 11:12:14 Finished %s [npm install]

问题答案:

使用此答案中提供的解决方案:流命令输出进度

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}

一些解释:

这行:

scanner := bufio.NewScanner(stdout)

创建一个bufio.Scanner将从提供该进程写入的输出的管道读取的。

这行:

scanner.Split(bufio.ScanRunes)

指示扫描程序以runes代替默认行来读取输入。

请注意,上面的示例仅流式处理标准输出。如果您还需要标准错误流,也可以从阅读Command.StderrPipe()

还要注意,这不适用于某些命令不能将所有内容写入其标准输出或错误的命令。



 类似资料:
  • 问题内容: 我想编写一个函数,该函数将执行shell命令并以字符串形式返回其输出,无论是错误还是成功消息。我只想获得与命令行相同的结果。 能做到这一点的代码示例是什么? 例如: 问题答案: 这个问题的答案取决于你使用的Python版本。最简单的方法是使用以下功能: 该功能适用于仍在广泛使用的几乎所有版本的Python(2.7+)。2但对于较新的版本,不再推荐使用此方法。 现代版本的Python(3

  • 问题内容: 我正在使用Groovy在我的Linux机器上执行命令并返回输出,但是我无法以某种方式使用管道(我认为),或者它可能没有在等待命令完成。 有什么问题或我的代码中缺少什么? 我的调用函数: 文件内容(更新:添加了exitVal println): 我的输出(更新:添加了exitVal值): 注意:我在内部使用。 问题答案: 您不能使用进行管道或重定向。这在Java中不起作用,因此在Groo

  • 问题内容: 在node.js中,我想找到一种方法来获取Unix终端命令的输出。有什么办法吗? 问题答案: 那就是我现在正在工作的项目中这样做的方式。 示例:检索git用户

  • 问题内容: 上面的代码是我的bash文件。这里有两个命令 创建txt文件 执行Docker容器 如果我运行此命令 在终端然后它正在工作 但是当我在crontab中运行时 那么只有txt文件创建有效,而docker容器无效。 问题答案: 使用伪tty并以交互方式运行的请求,但是cron不会附加到任何TTY。尝试删除在

  • 我想使用OpenNLP来标记泰语单词。我下载了OpenNLP和Thai tokenize模型,并运行了以下程序 我将下载的放在我调用的目录中并运行以下内容。在中包含此文本。但是,我得到的输出只有这些文本: 我对OpenNLP非常陌生,如果有人知道如何从中获取输出,请告诉我。

  • 在一个节点中。js,我想找到一种获取Unix终端命令输出的方法。有没有办法做到这一点?