os / execパッケージを使用して複数のコマンドを実行する方法を理解できません。私はネットとスタックオーバーフローを調べましたが、私の場合に役立つものは何も見つかりませんでした。これが私のソースです:
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が実行され、新しいシェルで./configureが実行されるためと私は推測しています。何か案は?更新作業ディレクトリを変更してから./configureおよびmakeコマンドを実行することで問題を解決しました
err = os.Chdir(folderPath)
if err != nil {
fmt.Println("File Path Could not be changed")
os.Exit(1)
}
それでも、同じシェルでコマンドを実行する方法があるかどうか知りたいです。
単一のシェルインスタンス内で複数のコマンドを実行する場合は、次のようにしてシェルを呼び出す必要があります。
cmd := exec.Command("/bin/sh", "-c", "command1; command2; command3; ...")
err := cmd.Run()
これにより、シェルは指定されたコマンドを解釈します。また、のようなシェル組み込みを実行することもできますcd
。これは、ユーザーデータを安全な方法でこれらのコマンドに置き換えるのは簡単ではないことに注意してください。
代わりに、特定のディレクトリでコマンドを実行するだけの場合は、シェルなしで実行できます。現在の作業ディレクトリを設定して、次のようにコマンドを実行できます。
config := exec.Command("./configure", "--disable-yasm")
config.Dir = folderPath
build := exec.Command("make")
build.Dir = folderPath
...前と同じように続けます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加