Goで外部コマンドを実行して出力をリアルタイム表示するサンプル

この記事は最終更新日から5年以上が経過しています。

はじめに

外部コマンドを実行して出力をリアルタイム表示するサンプルコマンドを作ってみました。

サンプルコマンドに-vを指定した時は冗長モードでリアルタイム表示しつつ、外部コマンド終了時に標準出力と標準エラー出力の結果を文字列で取得します。

-vを指定しない時は、外部コマンド実行中のリアルタイム表示は無しで、外部コマンド終了時に標準出力と標準エラー出力の結果を文字列で取得するほうだけを行います。

スクリーンショット

tty.gif

実装メモ

ソース: https://github.com/hnakamur/execcommandexample

コマンドを実行して出力を読み取るサンプルはexec.Cmd.StdoutPipe()のExampleにコード例があります。

標準出力と標準エラー出力を両方リアルタイムに呼び出したいので、StdoutPipe()とStderrPipe()を取得して、2つのgoroutineでそれぞれ読みだして出力するようにしました。
https://github.com/hnakamur/execcommandexample/blob/master/main.go#L53-L54

また、最終的な結果を取るためにio.TeeReaderを使ってBufferにも保存しています。
https://github.com/hnakamur/execcommandexample/blob/master/main.go#L45-L47

TeeReaderを使った関係で、verbose=falseのときもReaderからは読み取っておく必要があります。
https://github.com/hnakamur/execcommandexample/blob/3f4f3a2c659323d3ada722961b0439c22bf77467/main.go#L74

カラー表示用の文字列生成は github.com/mgutz/ansiを使いました。

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
コメント
この記事にコメントはありません。
あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした