golang

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

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

.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
Last-modified: 2018-10-02 (火) 12:24:34