こんにちは。Tomoyuki(@tomoyuki65)です。
Go言語(Golang)でなんらかのツールを作る際、“プログラムの中から直接シェルコマンドを実行したい”という場合もあると思います。
その際は外部コマンドを実行させる「os/exec」パッケージがあり、これを使えばGo言語のプログラムの中から直接シェルコマンドの実行が可能です。
この記事では、そんなGo言語(Golang)でシェルコマンドを実行する方法についてご紹介します。
Go言語(Golang)でシェルコマンドを実行する方法【os/execパッケージ】
Go言語(Golang)の「os/exec」パッケージは、外部コマンド(シェルコマンドや他のプログラム)を起動・制御するための標準パッケージです。
コマンドの実行方法
コマンドを実行したい場合、「exec.Command」を使ってコマンドを定義し、「Run()」メソッドで実行できます。
package main
import (
"fmt"
"os/exec"
)
func main() {
// コマンドの定義
cmd := exec.Command("pwd")
// コマンド実行
err := cmd.Run()
if err != nil {
fmt.Printf("エラーが発生しました。: %v\n", err)
}
}
※もし開発時にGo言語のDockerコンテナを使っている場合、そのコンテナ内で対象のコマンドが使える必要があります。ローカル環境のコマンドを実行させたい場合は、ビルドしたバイナリファイルを直接実行するか、ローカル環境にGoをインストールして開発する必要があります。
コマンドの出力結果を使いたい場合は、「Output()」メソッドを使います。
package main
import (
"fmt"
"os/exec"
)
func main() {
// コマンドの定義
cmd := exec.Command("pwd")
// コマンド実行
out, err := cmd.Output()
if err != nil {
fmt.Printf("エラーが発生しました。: %v\n", err)
}
// 出力結果を表示
fmt.Println(string(out))
}
実行結果
/
尚、以下のように一つのコマンドで実行することも可能です。
package main
import (
"fmt"
"os/exec"
)
func main() {
// コマンド実行
out, err := exec.Command("pwd").Output()
if err != nil {
fmt.Printf("エラーが発生しました。: %v\n", err)
}
// 出力結果を表示
fmt.Println(string(out))
}
また、出力結果に標準エラーも含めたい場合は、「CombinedOutput()」メソッドを使います。
package main
import (
"fmt"
"os/exec"
)
func main() {
// コマンド実行
out, err := exec.Command("ls", "/non-existent-directory").CombinedOutput()
if err != nil {
fmt.Printf("エラーが発生しました。: %v\n", err)
}
// 出力結果を表示
fmt.Println(string(out))
}
実行結果
エラーが発生しました。: exit status 1
ls: /non-existent-directory: No such file or directory
コマンドにタイムアウト設定をしたい場合は?
コマンドにタイムアウト設定をしたい場合は、コンテキストと「CommandContext()」メソッドを使うことで設定可能です。
package main
import (
"context"
"fmt"
"os/exec"
"time"
)
func main() {
// コンテキストでタイムアウト設定
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
// コマンドの定義
cmd := exec.CommandContext(ctx, "pwd")
// コマンド実行
out, err := cmd.Output()
if err != nil {
fmt.Printf("エラーが発生しました。: %v", err)
}
// 出力結果を表示
fmt.Println(string(out))
}
最後に
今回はGo言語(Golang)でシェルコマンドを実行する方法について解説しました。
普段はあまり使いませんが、ツール開発などでは使う可能性があるため、興味がある方はぜひ覚えておきましょう。



コメント