2020/08/23

WindowsのコマンドプロンプトやPowerShellでも簡単に色付き出力できるcoloutツールを作りました!


色付きで出力したい

CLIツールやスクリプトで自動化処理などを進めていると、タスクの成功や失敗をユーザーに伝えたいことが多々あります。そんな時、他のログと同じように白い文字で出力すると埋もれてしまいがちです。こんな感じに。

昨今のGolangやRust、Pythonなどで作られたCLIツールでは、色をつけてパッと見で成功したのか失敗したのか示してくれるものが多数あります。そんなイメージで、スクリプトで出力するメッセージやレガシーなCLIツールの出力に色をつけられると少し利便性が向上しそうです。ほら、こんな感じで。


という訳でGolangで簡単に作ってみました。 

colout

🎨 It's a simple and tiny tool for getting colored output in scripts.

https://github.com/kemokemo/colout

Colored output anywhere

インストールしてみてね

WindowsだけでなくLinux、FreeBSD、macOSなどにも対応しており、ScoopHomebrewといったパッケージ管理の仕組みを使ってインストールが可能です。

この記事では例としてWindowsでScoopを使ってインストールしてみます。まずはkemokemoのバケットを追加してください。

scoop bucket add kemokemo-bucket https://github.com/kemokemo/scoop-bucket.git

次にインストールです。

scoop install colout

使ってみよう

使い方も簡単で、つけたい色をサブコマンド(例えばsuccessなど)で指定して、echoコマンドに渡すように出力したい内容を引数で渡すだけです。使用可能なサブコマンドは公式リポジトリのUsageをご覧いただくか、colout -hを実行すると表示されるヘルプを確認してください。

例えば、下図のようにタスクが成功したことを緑色の出力で伝える処理を書いてみましょう。

まずは、Windowsのバッチファイルだとこんな感じです。

@echo off

echo.
echo 重い処理を実行中...
echo (いろいろなログが出力)
echo .....
echo ....
echo ...
echo ..
echo .
echo. 

if %errorlevel% == 0 (
  colout success タスクが成功しました!
) else (
  colout error タスクが失敗しました。。
)

echo.

サブコマンドで色を指定するechoコマンドみたいな雰囲気で使えます。次に、PowerShellスクリプトも書いてみましょう。

Write-Host 
Write-Host 重い処理を実行中...
Write-Host (いろいろなログが出力)
Write-Host .....
Write-Host ....
Write-Host ...
Write-Host ..
Write-Host .
Write-Host 

if($?) {
  colout success タスクが成功しました!
}
else {
  colout error タスクが失敗しました。。
}

Write-Host 

まとめ

coloutを使えば、手軽に色付きログを利用できるようになります。タスク実行結果に目を凝らさなくても成功か失敗かを判別できるようになるのは、ちょっとしたことですが日々の開発にプラスになるのではないかと思います。

是非使ってみてください。そしてお気づきの点があれば公式のIssueにご連絡いただけると嬉しいです。それでは、良きスクリプトライフを!ʕ◔ϖ◔ʔ 

2020/07/08

コマンドプロンプト、PowerShell、zshなどでの終了コード(ExitCode)の確認方法まとめ


概要


コードの静的解析やCI/CDでのチェックのためなどで、CLIツールを使うことがあります。

CLIツールを組み合わせてタスクを実行するスクリプト(*.bat、*.ps1、*.shなど)を作る際、処理の成否を終了コード(ExitCode)で判断して条件分岐を行いたい場合がありますが、この終了コードのチェック方法がシェルによって微妙に違っており、毎回調べてしまっておりました。

自分用の備忘録として、情報を整理して記事にします(:3[ふとん]

終了コード確認方法


終了コード確認例
macOSのzshおよびPowerShellにて終了コード確認

コマンドプロンプト

echo %errorlevel%

PowerShell

echo $?
スクリプトの中で直前に実行した処理の成否を確認するなら、後述のbashシェルスクリプトなどと同様に$?を指定する。

echo $LASTEXITCODE
外部スクリプトの呼び出しなどでは使えるけれど、ちょっとややこしいので私はあまり使わないです。詳しくは公式のマニュアルを参照ください。(2020/08/08 改定)

bash、zshなど

echo $?

所見


PowerShellはこれに限らず独自色が強いですね。巷で先人たちが公開してくださっている素晴らしいシェル芸の多くはshやbashを使った内容が多いので、できればWindowsでもWSL2をみんなで導入してシェルスクリプト(*.sh)メインで使えるようになるのが理想だなと思います。

おまけ

golangのコードで外部コマンドを実行した時のExitCodeは、func (*ProcessState) ExitCodeで調べられる。The Go Playgroundで実際に動かせるサンプルはこちら

2020/01/09

Go言語のCLIアプリを作りながらCircleCIでCI/CDを実践してみた

概要

以下を目標に、Go言語で簡単なCLIツールを作りながらCI/CDを実践してみました!
  • CIでtestbuildを実行して、READMEにバッジを貼る
  • テストカバレッジ計測し、READMEにバッジを貼る
  • gitでtagがついたら、バイナリを作ってgithubのリリースページにアップする
以下のリポジトリが成果物です。

A repository to play around with using CircleCI.

github.com/kemokemo/try-circle-ci
実践内容をハンズオンっぽくまとめると共に、ポイントやお世話になった記事をあわせて紹介したいと思いますʕ◔ϖ◔ʔ