我遇到了使用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和make命令来解决了问题。
err = os.Chdir(folderPath)
if err != nil {
fmt.Println("File Path Could not be changed")
os.Exit(1)
}
我仍然好奇是否有一种方法可以在同一个Shell中执行命令。
StdoutPipe()
将命令管道连接到第二个命令的Stdin
。 - James Henstridge