У меня возникли проблемы с выяснением того, как запускать несколько команд с помощью пакета os/exec. Я троллировал сеть и stackoverflow и не нашел ничего, что сработало бы для меня. Вот мой источник:Запуск нескольких команд 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 выполняется и в новой оболочке ./configure выполняется вместо того, чтобы находиться в том же каталоге из предыдущей команды. Есть идеи? UPDATE Я решил проблему путем изменения рабочего каталога, а затем выполнив ./configure и сделать команду
err = os.Chdir(folderPath)
if err != nil {
fmt.Println("File Path Could not be changed")
os.Exit(1)
}
Тем не менее теперь я хотел бы знать, если есть способ для выполнения команд в одной оболочке ,
Благодарим вас за ответ. Я особенно ценю ваше первое предложение. Я наткнулся на ваше второе предложение и в настоящее время его использую. – reticentroot
@James Я пробовал так, как вы предлагали. команда: = exec.Command ("эхо * tar.gz | xargs -n1 деготь ZXF") command.Dir = pathFinal cmdErr: = command.Run() Это не работает для меня на otherhand, команда : = "cd" + pathFinal + ";" + "echo * tar.gz | xargs -n1 tar zxf" cmd: = exec.Command ("/ bin/sh", "-c", команда) Работает , Я хочу реализовать его первым способом. Я не знаю, почему он не работает. – supriya
Он выдает ошибку: Не удалось распаковать файл: exec: "echo * tar.gz | xargs -n1 tar zxf": исполняемый файл не найден в $ PATH – supriya