2015-12-24 2 views
3

У меня возникли проблемы с выяснением того, как запускать несколько команд с помощью пакета 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) 
    } 

Тем не менее теперь я хотел бы знать, если есть способ для выполнения команд в одной оболочке ,

ответ

14

Если вы хотите запустить несколько команд в одном экземпляре оболочки, вам нужно будет ссылаться на оболочку с чем-то вроде этого:

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 

... и продолжайте, как раньше.

+0

Благодарим вас за ответ. Я особенно ценю ваше первое предложение. Я наткнулся на ваше второе предложение и в настоящее время его использую. – reticentroot

+0

@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

+0

Он выдает ошибку: Не удалось распаковать файл: exec: "echo * tar.gz | xargs -n1 tar zxf": исполняемый файл не найден в $ PATH – supriya

Смежные вопросы