メインコンテンツまでスキップ

標準入力・標準出力・終了ステータスを知る

この章でできるようになること

CLIツールが入力を受け取り、出力し、成功失敗を返す基本を説明できるようになります。

まず知っておくこと

CLIの道具は、入力、出力、終了ステータスを組み合わせて動きます。

標準入力
→ コマンドに渡される入力

標準出力
→ 通常の結果出力

標準エラー
→ エラーや警告の出力

終了ステータス
→ 成功か失敗かを表す番号

この考え方は、シェルスクリプトでもGoのCLIでも使います。

標準出力、標準エラー、終了ステータス

終了ステータスを見る

成功するコマンドを実行します。

cd ~/vibe-practice/local-automation
./bin/vibe-note "status check"
echo $?

多くの場合、成功すると 0 が表示されます。 ./bin/vibe-note が見つからない場合は、前章の go build まで戻って実行ファイルを作ってください。

失敗する例も見ます。

ls does-not-exist
echo $?

0 以外が表示されるはずです。

echo $? は、直前のコマンドの終了ステータスを表示します。

標準出力をファイルに保存する

GoのCLIの出力をファイルに追記します。

./bin/vibe-note "saved output" >> logs/go-note.log

確認します。

tail -n 5 logs/go-note.log

ここでも >> は追記です。 第1部、第4部1章で使った追記と同じ考え方です。

生成物とログをGitから外す

bin/ の実行ファイルや logs/ のログは、実行するたびに変わる生成物です。 練習では、ソースコードやスクリプトをcommitし、生成物とログはcommitしない形にします。

第3部で学んだ .gitignore を使います。 この練習用リポジトリでは、まだ .gitignore がない前提で作ります。 すでに .gitignore がある場合は、上書きせず中身を確認してから追記します。

printf "bin/\nlogs/*.log\n" > .gitignore

状態を確認します。

git status

bin/vibe-notelogs/go-note.log がcommit候補から外れているか確認します。

エラーを読む

存在しないコマンドを実行してみます。

not-a-real-command

command not found のような表示が出るはずです。

第1部で扱ったように、これはコマンドが見つからない状態です。 PATHにないのか、インストールされていないのか、名前を間違えたのかを確認します。

シェルスクリプトで終了ステータスを使う

次の内容で scripts/check-note.sh を作ります。

cat > scripts/check-note.sh <<'EOF'
#!/usr/bin/env bash

set -euo pipefail

if [ ! -f logs/daily-note.log ]; then
echo "logs/daily-note.log がありません" >&2
exit 1
fi

echo "ログがあります"
EOF

実行権限を付けます。

chmod +x scripts/check-note.sh

実行します。

./scripts/check-note.sh
echo $?

何が起きたのか

>&2 は、標準エラーへ出力する指定です。 exit 1 は、失敗として終了する指定です。

CLIツールは、文章を表示するだけではありません。 成功したか失敗したかを終了ステータスで周りの道具に伝えます。

運用者の視点

自動化では、失敗を検知できることが重要です。

終了ステータスを無視すると、失敗しているのに成功したように次へ進むことがあります。 定期実行やGitHub Actionsでも、終了ステータスは重要になります。

理解チェック

CLIの出力と終了ステータスを分けて見られるか、AIに問題を出してもらいます。

標準出力、標準エラー、終了ステータスの違いを確認する練習問題を出してください。

次の条件でお願いします。

- 問題は5問
- 一問一答形式にする
- 1問ずつ表示し、その直下にA/B/Cの選択肢も毎回表示して、私の回答を待つ
- 選択肢は、A: 標準出力、B: 標準エラー、C: 終了ステータス にする
- 私は、各問題に対してA/B/Cだけで回答します
- 私が回答するまで、その問題の答え、採点、解説を表示しないでください
- 私が回答したあとで、その問題を採点し、理由も解説してください
- 解説が終わったら、次の問題を1問だけ出してください
- コマンドは実行しないでください

AIに聞いてみよう

標準入力、標準出力、標準エラー、終了ステータスを、
シェルスクリプトとGoのCLIの例で説明してください。

第4部で作った daily-note.sh、vibe-note、check-note.sh を前提にしてください。
まだファイルは変更しないでください。

commitポイント

変更を確認します。

git status
git diff

ここでは、.gitignore とスクリプトだけcommitします。

git add .gitignore scripts/check-note.sh
git status
git diff --staged

bin/ やログファイルがcommit候補に入っていないことを確認します。

問題なければcommitします。

git commit -m "Add note check script"

次へ

次は、cronとlaunchdで定期実行を知ります。