ターミナル/シェルにそんなに詳しくない方から気になることを言われることがありました.
手順書どおり順番にコマンドを入力/実行しましたが, うまくいきません.
手順書には, いくつかの実行コマンドを順番に実行するよう指示するところがあります. そのあとの工程が期待通りにならないと言うのです.
このケースでは手順書の作成者に問い合わせるべきと思います (例が悪い), もうちょっと突っ込んで気にしてみてほしいのは, 「途中のコマンドが失敗していないか」です.
あらゆる実行コマンドには終了コードがある
終了コード.
終了ステータス.
呼称はいろいろですが, あらゆる実行可能なコマンド/ソフトウェアには終了コードがあります.
細かくここでは書けませんが, この終了コードが「0」の場合は正常終了. それ以外の場合はなんらかのエラーであることを表します.
コマンド実行に失敗したら終了コードを表示する
コマンド実行時の出力内容で失敗していることが分かるケースもありますが, 終了コードも同時に確認するべきです.
bash/zshの場合は $?
という特別な変数に直前に実行したコマンドの終了コードが入っています.
実行例.
ubuntu@5b0c5a8de6b7:~$ test 1 -eq 2
ubuntu@5b0c5a8de6b7:~$ echo $?
1
fishの場合は $?
ではなく $status
です.
ただ, コマンド実行するたびにこれをやるのは大変なので, コマンドの終了コードが「0」以外のときにだけ, 終了コードを出力するように設定することができます.
zsh
zshの設定ファイル ( $HOME/.zshrc
など) に次の設定を追加します.
setopt print_exit_value
実行例.
ubuntu@5b0c5a8de6b7 ~ % test 1 -eq 2
zsh: exit 1
print_exit_value
はzshが標準で備えるオプションです (デフォルトはOFF. zshはデフォルトでほとんどのオプションがOFF).
bash
bashの場合の標準的なやりかたは, 調べてもちょっとわからなったのですが (ご存知のかた教えてください), trapでできそうです. 次の設定をbashの設定ファイル ($HOME/.bashrc
など) へ追加します.
trap 'echo exit $?' ERR
実行例.
ubuntu@5b0c5a8de6b7:~$ test 1 -eq 2
exit 1
fish
fishの場合は直前の実行コマンドが失敗している場合, プロンプトに終了コードが表示されるようになっています.
実行例.
ubuntu@b215f2bf0b47 ~> test 1 -eq 2
ubuntu@b215f2bf0b47 ~ [1]>
(おまけ) 終了コードはスクリプトにも応用できる
終了コードはインタラクティブシェル (ここまでで例示したプロンプトが表示された状態でコマンド実行する, 対話式のシェル) だけでなく, シェルスクリプトで使われることもあります.
if
や while
といった制御構文は真偽 (true/false) を判定します.
「0」が真 (true), それ以外が偽 (false) です.
ここで判定に使っているのは終了コードです.
例示するif文はgrepコマンドの終了コードを判定しています.
if grep -q "trap" $HOME/.bashrc; then
echo "OK"
else
echo "NG"
fi
よく見かける書き方はこれですかね
if [ $n -eq $m ]; then
echo "OK"
else
echo "NG"
fi
[ $n -eq $m ]
は testコマンドと同じです.
ubuntu@b215f2bf0b47:~$ test 1 -eq 2
exit 1
ubuntu@b215f2bf0b47:~$ [ 1 -eq 2 ]
exit 1