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