2017-04-06 17 views
4

私のメソッドは、execに文字列としてコマンドを受け取るようにしたい。入力文字列にスペースがある場合は、どのようにそれをcmdに分割するのですか?os.execの引数は?スペースで文字列からos.execコマンド構造体を作成する方法

a := string("ifconfig") 
cmd := exec.Command(a) 
output, err := cmd.CombinedOutput() 
fmt.Println(output) // prints ifconfig output 

これは失敗します:

ドキュメントは

cmd := exec.Command("tr", "a-z", "A-Z") 

これは正常に動作しますように私のExec.Cmd構造体を作成するために言う

a := string("ifconfig -a") 
cmd := exec.Command(a) 
output, err := cmd.CombinedOutput() 
fmt.Println(output) // 'ifconfig -a' not found 

は私がstrings.Splitを試してみました(A )、エラーメッセージを受け取る:exec.Commandへの引数に型文字列として(型[]文字列)を使用できない

空白の
+0

あなたstrings.Splitを(使用)間違ってはgolang.org/pkg/strings/#分割する場合は、区切り記号を入力する必要があります。 so .. strings.Split(a、 "")は1つのスペースで分割され、2つ目は既に分割されているため分割できないため、変数 "a"は既にスライスであり文字列ではありません。最後に、文字列を分割する代わりにスライスを定義することもできます。 a:= [] string {"inconfig"、 "a"}。 – reticentroot

答えて

5

、チェックしてみて下さい: https://golang.org/pkg/os/exec/#example_Cmd_CombinedOutput

あなたのコードはexec.Commandので失敗は、コマンド引数が実際のコマンド名から分離されることを期待しています

strings.Split署名(https://golang.org/pkg/strings/#Split):あなたが達成しようとした

func Split(s, sep string) []string 

何:

command := strings.Split("ifconfig -a", " ") 
if len(command) < 2 { 
    // TODO: handle error 
} 
cmd := exec.Command(command[0], command[1:]...) 
stdoutStderr, err := cmd.CombinedOutput() 
if err != nil { 
    // TODO: handle error more gracefully 
    log.Fatal(err) 
} 
// do something with output 
fmt.Printf("%s\n", stdoutStderr) 
+0

'exec.Command(command ...)'はもっと簡単ですIMO ;-) – kostix

+2

@kostixいいえ、動作しません。 Documentationは 'func Command(name string、arg ... string)* Cmd'です。したがって、文字通り、最初の引数(コマンド名)を別々に渡す必要があります。それ以外の場合は、 'exec.Command'の呼び出しで引数が足りないというエラーが発生します。私は彼が同じ間違いをしたので、@マークの答えの下でそれを指摘しました。 – mwarzynski

+0

愚かな私 - 修正のおかげで! ;-) – kostix

4
args := strings.Fields("ifconfig -a ") 
exec.Command(args[0], args[1:]...) 

strings.Fields()分割、およびスライス

...を返しますが、個々の文字列引数にスライスを展開し

+1

コードを実行すると、 'exec.Command'の呼び出しで引数が足りません。 コマンド名を別々に渡す必要があります。 – mwarzynski

+0

ありがとう@mwarzynski、更新されました。 – Mark

関連する問題