

Go言語からコマンドを打ちたいのですが、どうしたらよいのですか。

rubyではバッククオートで囲むだけで実行してくれるのですが。


CC BY-SA 3.0
2015-01-17T19:21:06.023
4763
2015-01-26T01:14:04.543
5855
question
go
Go言語でシェルを実行する方法


<http://golang.org/pkg/os/exec/#example_Cmd_Output>

[code]

    package main
    
    import (
        "fmt"
        "log"
        "os/exec"
    )
    
    func main() {
        out, err := exec.Command("date").Output()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("The date is %s\n", out)
    }
    
[/code]

<http://golang.org/pkg/os/exec/>  
目的によって、いくつかのメソッドがあります。


CC BY-SA 3.0
2015-01-17T19:59:23.883
4765
2015-01-17T19:59:23.883
635
4763
answer


ruby のバッククォートはシェルを介して実行されます。ですので、

[code]

    `foo -flag`
    
[/code]

は実際には

[code]

    $SHELL -c 'foo -flag'
    
[/code]

として実行されます。つまり引数は `$SHELL` が解析し `foo` と `-flag` に分割されます。  
golang には system(3) の様に、シェルを介してコマンドを実行する命令はありません。erukiti さんが書いておられる様に

[code]

    exec.Command("foo", "-flag")
    
[/code]

という形で Cmd オブジェクトを作成して Output から標準出力を得るか、ruby のバッククォートと同様に

[code]

    exec.Command(os.Getenv("SHELL"), "-c", "foo -flag")
    
[/code]

とする事で期待の動作が得られるかと思います。  
文字列を `exec.Command` に渡す配列形式に分割したいのであれば、[go-
shellwords](https://github.com/mattn/go-shellwords) が使えるかと思います。


CC BY-SA 3.0
2015-01-26T01:14:04.543
5281
2015-01-26T01:14:04.543
440
4763
answer