GO言語から何か実行してその結果を取り込んだりします。
PID取得なども、おいおい書きますがとりあえず最低限。
err := exec.Command("ls", "-la").Run()
out, err := exec.Command("ls", "-la").Output()
err := exec.Command("ls", "-lR").Start()
サンプルを自分で書こうと思いましたが、きれいなお手本が参考サイトにありましたので、とりあえずお借りします。あとで手直しするかもです。
待つにはWait()を使います。
package main import ( "fmt" "os/exec" "time" ) func main() { fmt.Println("処理開始: ", time.Now().Format("15:04:05")) cmd := exec.Command("sleep", "5s") cmd.Start() fmt.Println("sleep中: ", time.Now().Format("15:04:05")) cmd.Wait() fmt.Println("sleep終了: ", time.Now().Format("15:04:05")) }
これの実行結果は以下。(cygwin環境で試しました)
処理開始: 09:41:56 sleep中: 09:41:56 sleep終了: 09:42:01
なるほど、ちゃんとお手本の通り、.Wait()で5秒待ってくれてますね。
同上にお手本でいきます。
package main import ( "fmt" "io" "os/exec" ) func main() { cmd := exec.Command("wc") stdin, _ := cmd.StdinPipe() io.WriteString(stdin, "hoge") stdin.Close() out, _ := cmd.Output() fmt.Printf("結果: %s", out) }
手元で実行した結果は以下です。
結果: 0 1 4
package main import ( "fmt" "log" "os/exec" ) func main() { path, err := exec.LookPath("go") if err != nil { log.Fatal("not found") } fmt.Printf("go is available at %s\n", path) }
実行結果は以下。(cygwin+オフィシャルGO)
go is available at C:\Go\bin\go.exe
.Output()の出力はバイトコードなので、string化して取り出してみましょう。
package main import ( "fmt" "os/exec" "log" ) func readNHK(url string) string{ out, err := exec.Command("w3m","-dump", url).Output() if err != nil { log.Fatal("not found") } return string(out) } func main() { fmt.Println(readNHK("https://URL..../")) }