2016-10-17 2 views
1

現在、LinuxのGolangで簡単なechoコマンドを実行しようとしています。私のコードは次のとおりです:Golangのエコーコマンド

cmd = exec.Command("echo", "\"foo 0x50\"", ">", "test.txt") 

_, err = cmd.Output() 

if err != nil { 
    fmt.Println(err) 
} 

しかし、test.txtのは、(後においても、コードをコンパイルして実行)私のフォルダに表示されません。私はコマンドを実行するためにこのメソッドを使用する最初のものではなく、私はechoコマンドでブロックされることは決して考えませんでした。

test.txtに「foo 0x50」(引用符付き)を付けるには、どうすればこのコードを修正できますか?

ありがとうございます!

答えて

3

あなたはこのように標準出力をリダイレクトすることができます

// Remove the redirect from command 
cmd := exec.Command("echo", "\"foo 0x50\"") 

// Make test file 
testFile, err := os.Create("test.txt") 
if err != nil { 
    panic(err) 
} 
defer outfile.Close() 

// Redirect the output here (this is the key part) 
cmd.Stdout = testFile 

err = cmd.Start(); if err != nil { 
    panic(err) 
} 
cmd.Wait() 
+0

大丈夫!なぜ私は最初に試したように1行でできないのですか? – Majonsi

+2

@Majonsi、はいのように - あなたは、あなたの* shell、*と 'exec.Cmd.Run'がシャベルを入れるOSカーネルによって解釈されることを知っているだけですプロセス仕様には何も分かりません。ですから、 "/ bin/echo"が生成されずにシェルに伝えられるように、 ''/bin/sh -c''をエコーし​​ます。特定のスクリプトを実行する。シェルは、スクリプトからのリダイレクトを解析し、それらが起こるように手配します。 – kostix

+2

@Majonsi、それはうまくいくが、その経路を踏む前に* 3倍(またはそれ以上)考える必要があることを覚えておいてください:一重引用符や二重引用符やリダイレクト記号などが含まれている可能性のあるデータ引用符で入力してください。あなたがコマンドを渡す必要がある場合は、ユーザから取得したデータを実行している必要があります。シェルによって解釈されないように適切に保護しなければならないことです。それは、その引用地獄を彷彿とさせることです。それの中に - ディープ。本当にうまくいきません。 – kostix