2015-12-24 73 views
3

我很難弄清楚如何使用os/exec包運行多個命令。我拖了網和stackoverflow,並沒有發現任何東西適用於我的情況。這裏是我的來源:在同一個shell中運行多個Exec命令golang

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路徑執行並在一個新的shell中執行./configure,而不是與前一個命令位於同一個目錄中。有任何想法嗎? UPDATE我通過改變工作目錄,然後執行./configure和make命令

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

不過現在我很好奇,想知道是否有在同一個shell執行命令的方式來解決這個問題。

回答

14

如果你想單殼實例中運行多個命令,你需要像這樣的東西來調用外殼:

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

這將讓shell來解釋給定的命令。它也可以讓你執行shell之類的東西,比如cd。請注意,以安全的方式將用戶數據替換爲這些命令可能不是微不足道的。

如果您只是想在特定目錄中運行命令,則可以在沒有shell的情況下執行該命令。您可以設置當前工作目錄執行命令,如下所示:

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

...並繼續像以前一樣。

+0

謝謝你的回答。我特別感謝你的第一個建議。我偶然發現了你的第二個建議,並且正在使用它。 – reticentroot

+0

@詹姆斯我嘗試了你的建議。 command:= exec.Command(「echo * tar.gz | xargs -n1 tar zxf」) command.Dir = pathFinal cmdErr:= command.Run() 這不適用於我的另一種命令, 命令:=「cd」+ pathFinal +「;」+「echo * tar.gz | xargs -n1 tar zxf」 cmd:= exec.Command(「/ bin/sh」,「-c」,command) This is working 。我想以第一種方式實施它。我不知道它爲什麼不起作用。 – supriya

+0

它引發錯誤: 解壓文件失敗:exec:「echo * tar.gz | xargs -n1 tar zxf」:可執行文件未在$ PATH中找到 – supriya