shell scriptでエラーをみやすくする

GNU/Linux上で書かれテストされたスクリプトmacOS上で正しく実行されない、あるいはその逆で、コアとなるユーティリティのGNU版とBSD版の違いのために正しく実行されないというのはよくある問題です。エラーメッセージはスクリプトの出力で溺れてしまうことがあり、何かが正しく実行されていないことは自明ではない場合がある。

基本 exit code

error_exit()
{
        # stderrに出力
    echo "$1" 1>&2
    exit 1
}


if cd $your_directory; then
    rm *
else
    error_exit "cannnot move to directory "
fi

任意のコマンドの失敗でexit

POINT : -e オプションを指定して set builtin コマンドを使用する

# 特定のコマンドの実行に失敗した場合exitする
set -e

特定のコマンドが失敗した場合のみ終了する

特定のコマンドが失敗したときだけ気にしたいときもある。このような場合は、明示的に呼び出されてステータスコードをチェックし、必要に応じて終了する必要がある。

exit_on_error() {
    execution_code=$1
    latest_command=${@:2}
    if [ $execution_code -ne 0 ]; then
        >&2 echo "\"${latest_command}\" コマンドが失敗したため終了しました。終了コード: ${execution_code}."
        exit $ecode
    fi
}

# enable !! command completion
set -o history -o histexpand

ls --unknown-option
exit_on_error $? !!

output .

ls: illegal option -- -
usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]
exit_on_error $? ls --unknown-option
"ls --unknown-option" コマンドが失敗したため終了しました。終了コード: 1.