2016-10-08 13 views
2

プロンプトのコマンドを実行Golangは、このようなコマンドを実行するgolangのよう

package main 

import (
    "fmt" 
    "os/exec" 
    "log" 
    "os" 
) 

func main() { 
    argstr := []string{"script.sh", "arg1", "arg2"} 
    out, err := exec.Command("/bin/bash", argstr...).Output() 
    if err != nil { 
     log.Fatal(err) 
     os.Exit(1) 
    } 
    fmt.Println(string(out)) 
} 

をそしてここで、テキストファイルからの出力を転送する方法であります?

答えて

2

あなたが実行すべきコマンドは次のとおりです。

/bin/bash -c 'script.sh < text.txt' 

ので

argstr := []string{"-c", "script.sh < text.txt"} 

バッシュは、入力のリダイレクトを解釈し、仕事を行います。

+0

ありがとうございました!できます! 「(= exec.Command( "/ binに/ bashの"、 "script.sh") \t \t cmd.Stdin = strings.NewReader: \t FUNCメイン(){ \t \t CMD: も私は1つの以上の方法が見つかりました。 Test.txtファイル」のテキスト) \t \t bytes.Buffer アウトVAR \t \t cmd.Stdout =&アウト \t \t ERR:= cmd.Run() \t \t ERR = nilの{ \t \t \tログであれば! 。致命的(エラー) \t \t \t os.Exit(1) \t \t} \t \t fmt.Println(out.String())あなたは新しい答えとして、他のメソッドを追加することができます@Konstantin \t} – Konstantin

+0

。私は 'os.Open'を使ってファイルを読むだけです。 –

+0

こんにちは!はい、既に可能です! ありがとうございました! 興味深いことに、おそらくbashコマンド(** "os/exec" **のパッケージ)の実行だけでなく、sshのクライアントの実装(例えば、* * "crypto/ssh" **)? – Konstantin

0

プロヒント:私は常に安全プレーすることをお勧め

ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second) 
defer cancel() 
argstr := []string{"/bin/bash", "-c", "script.sh < text.txt"} 
cmd := exec.CommandContext(ctx, argstr...) 
cmd.Stderr = &errorBuffer 
cmd.Stdout = &outputBuffer 
err := cmd.Run() 
if err != nil { 
    return fmt.Errorf("something bad happened: %v", err) 
} 

をタイムアウトすることを忘れないでください。

+0

他の質問がありますか? – zerkms

+0

ええ、よく考えています。タイトルと質問は多少混乱しました。 :\ 問題のように見えるのは、 'exec.Command()'と 'bash'でパラメータを扱う方法です。 – danielnegri

関連する問題