ちょっと複雑なシェルスクリプトをGoで書く
see also /lacolaco-engineering/ちょっと複雑なシェルスクリプトをJavaScriptで書く
ちょっと複雑なシェルスクリプトを書くことになったら最近はGoで書いている
ちなみに前はRubyだった
良いところ
必要十分な機能やパッケージが標準で含まれており、だいたい依存フリーで書ける
strconvとかstringsとか
os/exec ← 重要
Goroutineやsync, x/syncパッケージのおかげで並行処理が安全に書きやすい
静的型検査があるのでしょうもないエラーが実行前に気付ける
go run $pkg でLLっぽい使い勝手が得られる
その気になれば再配布しやすい
go build したバイナリを配ればよい
クロスコンパイルできるので、cgoとかに注意すればヨシ
https://github.com/itchyny/gojq があるので jq のバイナリそのものに依存せず同等の処理を書ける
気をつけるところ
os/execのcontext.Contextサポートはやや微妙で、cancelされる時は問答無用でSIGKILLが飛んでくる
これは karupanerura さんに教えてもらった karupanerura++
https://github.com/k1LoW/exec がos/execと互換のインターフェースを備えているので、これを使うのが良いと思う
Songmu/timeoutからコマンドの停止処理部分を理解しつつ切り出してk1LoW/execを作っている #gocon - Copy/Cut/Paste/Hatena
注意すべきはデフォルトだとos/execとの互換のためsigkillが送られる
SIGTERMを送るにはこんなかんじ
code:exec.go
cmd := (&exec.Exec{
KillAfterCancel: -1,
Signal: os.Interrupt,
}).CommandContext(ctx, t.path, t.args...)