PR

Go言語(Golang)でシェルコマンドを実行する方法【os/execパッケージ】

2. 基礎

こんにちは。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)でシェルコマンドを実行する方法について解説しました。

普段はあまり使いませんが、ツール開発などでは使う可能性があるため、興味がある方はぜひ覚えておきましょう。

 

この記事を書いた人
Tomoyuki

SE→ブロガーを経て、現在はSoftware Engineer(Web/Gopher)をしています!

Tomoyukiをフォローする
2. 基礎
スポンサーリンク
Tomoyukiをフォローする

コメント

タイトルとURLをコピーしました