猿问

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

我无法弄清楚如何使用 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)


}


我想像从终端一样执行命令。 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 中执行命令。


胡说叔叔
浏览 238回答 1
1回答

红颜莎娜

如果要在单个 shell 实例中运行多个命令,则需要使用以下内容调用 shell:cmd := exec.Command("/bin/sh", "-c", "command1; command2; command3; ...")err := cmd.Run()这将使 shell 解释给定的命令。它还可以让您执行 shell 内置函数,例如cd. 请注意,以安全的方式将用户数据替换为这些命令可能并非易事。相反,如果您只想在特定目录中运行命令,则可以在没有 shell 的情况下执行此操作。您可以设置当前工作目录以执行命令,如下所示:config := exec.Command("./configure", "--disable-yasm")config.Dir = folderPathbuild := exec.Command("make")build.Dir = folderPath......然后像以前一样继续。
随时随地看视频慕课网APP

相关分类

Go
我要回答