#author("2018-10-02T12:24:34+09:00","default:yakumo_murakami","yakumo_murakami")
[[golang]]

GO言語から何か実行してその結果を取り込んだりします。~
PID取得なども、おいおい書きますがとりあえず最低限。

#contents

* 参考にしたサイト [#c804eefe]

- https://qiita.com/tanksuzuki/items/9205ff70c57c4c03b5e5
- https://golang.org/pkg/os/exec/#Command

* サンプル [#v945cab5]

** コマンドを実行する(結果を取得しない) [#vaa4f7be]

 err := exec.Command("ls", "-la").Run()

** コマンドを実行して結果を取得する [#ub00747c]

 out, err := exec.Command("ls", "-la").Output()

** コマンドを実行するが、完了を待たない [#a8f587be]

 err := exec.Command("ls", "-lR").Start()

** コマンドの完了を待つ [#f6619c0b]

サンプルを自分で書こうと思いましたが、きれいなお手本が参考サイトにありましたので、とりあえずお借りします。あとで手直しするかもです。

待つには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秒待ってくれてますね。

** 標準入力を渡す [#i7497e05]

同上にお手本でいきます。

 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


** 実行ファイルのパスを知りたい [#d9bfabe6]

- https://golang.org/pkg/os/exec/#LookPath

 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

* 応用・w3mでNHKニュースのRSSをもらってみましょう [#c3706daa]

.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..../"))
 }

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS