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

在同一shell golang中运行多个Exec命令

毋琪
2023-03-14
问题内容

我在弄清楚如何使用os / exec包运行多个命令时遇到了麻烦。我已经摸索了网络和stackoverflow,还没有找到任何适合我的案例。这是我的资料来源:

package main

import (
    _ "bufio"
    _ "bytes"
    _ "errors"
    "fmt"
    "log"
    "os"
    "os/exec"
    "path/filepath"
)

func main() {
    ffmpegFolderName := "ffmpeg-2.8.4"
    path, err := filepath.Abs("")
    if err != nil {
        fmt.Println("Error locating absulte file paths")
        os.Exit(1)
    }

    folderPath := filepath.Join(path, ffmpegFolderName)

    _, err2 := folderExists(folderPath)
    if err2 != nil {
        fmt.Println("The folder: %s either does not exist or is not in the same directory as make.go", folderPath)
        os.Exit(1)
    }
    cd := exec.Command("cd", folderPath)
    config := exec.Command("./configure", "--disable-yasm")
    build := exec.Command("make")

    cd_err := cd.Start()
    if cd_err != nil {
        log.Fatal(cd_err)
    }
    log.Printf("Waiting for command to finish...")
    cd_err = cd.Wait()
    log.Printf("Command finished with error: %v", cd_err)

    start_err := config.Start()
    if start_err != nil {
        log.Fatal(start_err)
    }
    log.Printf("Waiting for command to finish...")
    start_err = config.Wait()
    log.Printf("Command finished with error: %v", start_err)

    build_err := build.Start()
    if build_err != nil {
        log.Fatal(build_err)
    }
    log.Printf("Waiting for command to finish...")
    build_err = build.Wait()
    log.Printf("Command finished with error: %v", build_err)

}

func folderExists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil {
        return true, nil
    }
    if os.IsNotExist(err) {
        return false, nil
    }
    return true, err
}

我想要命令,就像从终端一样。 cd path; ./configure; make
因此,我需要依次运行每个命令,并等待最后一个命令完成后再继续。在当前版本的代码中,当前./configure: no such file or directory假设是因为执行cd path并在新的shell中执行了./configure,而不是与上一个命令位于同一目录中。有任何想法吗?
更新 我通过更改工作目录然后执行./configure和make命令解决了该问题

err = os.Chdir(folderPath)
    if err != nil {
        fmt.Println("File Path Could not be changed")
        os.Exit(1)
    }

现在我还是很好奇,是否有办法在同一个外壳中执行命令。


问题答案:

如果要在单个shell实例中运行多个命令,则需要使用以下命令来调用shell:

cmd := exec.Command("/bin/sh", "-c", "command1; command2; command3; ...")
err := cmd.Run()

这将使外壳解释给定的命令。它还可以让您执行像这样的shell内置程序cd。请注意,以安全的方式将用户数据替换为这些命令并非易事。

相反,如果您只想在特定目录中运行命令,则可以在不使用Shell的情况下执行该操作。您可以将当前工作目录设置为执行命令,如下所示:

config := exec.Command("./configure", "--disable-yasm")
config.Dir = folderPath
build := exec.Command("make")
build.Dir = folderPath

…并像以前一样继续。



 类似资料:
  • 问题内容: 我想运行一些命令,直到按Ctrl-C才会退出。是否可以运行一次即可运行所有这些程序,而Ctrl-C会全部退出它们?他们可以共享终端输出。 具体来说,我有罗盘编译器,coffeescript编译器和一个自定义命令,用于监视文件更改,所有命令都在运行以监视文件更改。我不想为每个命令加载一个终端。 问题答案: 该bash脚本适用于N个并行线程。每个参数都是一个命令。 捕获SIGINT时将杀死

  • 问题内容: 我正在开发一个Java应用程序,该应用程序偶尔会在Windows计算机上运行。在某个时候,我需要运行Cygwin提示符并在其中执行一些命令。 我找到了一个使用Runtime类的主题:http : //www.javaquery.com/2011/03/how-to-execute- multiple-command-in.html 但是,它不会启动真正的 cmd.exe 窗口,它仅在后

  • 我使用wkhtmltopdf从html生成pdf,我试图通过PHP exec()函数运行下面的命令,但它不生成pdf,我没有显示任何错误,虽然。但是当我通过命令行运行相同的命令时,它就工作了。 下面是我用来执行pdf生成命令的PHP代码taht。 有关我的设置的一些信息: 操作系统-Ubuntu 12.04 PHP版本 任何帮助将不胜感激,谢谢。

  • 问题内容: 我试图弄清楚如何使用argparser执行以下操作: 本身是一个子命令。我的目标是使脚本具有链接一系列子命令(成为其中一个命令)并按顺序执行它们的能力。在上面的示例中,它将执行构建,然后设置环境,然后再次执行构建。如何使用argparse完成此操作?我尝试了以下方法: 但是,似乎每次执行此操作时,它都会进入子命令并报告它不知道是什么。我尝试解析额外的内容,以便可以执行重复调用/链,但是

  • 问题内容: 使用该软件包,我想代表另一个用户在* nix操作系统上运行外部命令(当然go进程在具有su特权的另一个用户的root用户下运行) 我想避免使用“ su”或“ bash”命令,而只使用go即可。 我使用了一种方法,但这会将用户更改为主项目,我只需要将用户更改为外部子进程即可: 问题答案: 您可以将syscall.Credential结构添加到Cmd.SysProcAttr

  • 我正在使用nginx和rtmp模块来流式传输实时hls和mpeg-dash。这是我在nginx. conf中的rtmp命令 但它不是在玩。ffmpeg命令似乎根本没有运行。hls和dash文件夹是空的。有人能帮我吗?