499.status-pkgupdate 更新

id:hiro-ueda 様が作成された 499.status-pkgupdate が 6R 系に対応しました。
id:hiro-ueda:20060724


ということでまずはシェルスクリプトの全文を眺めてみます。

#!/bin/sh
#
# $Id: 499.status-pkgupdate,v 1.1.1.1 2006/07/24 01:14:43 ueda Exp $
#

# If there is a global system configuration file, suck it in.
#
if [ -r /etc/defaults/periodic.conf ]
then
    . /etc/defaults/periodic.conf
    source_periodic_confs
fi

export PATH=$PATH:/usr/local/sbin:/usr/local/bin
export LANG=C


if [ -x /usr/sbin/portsnap ]; then
	PORTSNAP=/usr/sbin/portsnap
elif [ -x /usr/local/sbin/portsnap ]; then
	PORTSNAP=/usr/local/sbin/portsnap
else
	echo "Cannot find portsnap(abort)"
	exit 64
fi

echo
echo "Ports/packages update check:"
($PORTSNAP cron && $PORTSNAP update) >/dev/null 2>&1

if [ $? -eq 0 ]; then
	portsdb -u >/dev/null 2>&1
	portversion -vL=
	rc=0
else
	echo "Failure of portsnap(*ERROR*)"
	rc=1
fi
echo

exit $rc


まずは下記の記述を見てみます。

if [ -x /usr/sbin/portsnap ]; then
	PORTSNAP=/usr/sbin/portsnap
elif [ -x /usr/local/sbin/portsnap ]; then
	PORTSNAP=/usr/local/sbin/portsnap
else
	echo "Cannot find portsnap(abort)"
	exit 64
fi


上記の記述を見ると、私が以前書いたシェルスクリプトでは随分無駄が多いという事がわかります。orz
id:cocelo:20060713:1152782079


更に上記の記述の中に下記の記述があります。

exit 64


この exit 64 というのが今回新しく発見した記述です。
私が以前シェルスクリプトについて解説した時に、 exit 0 でシェルスクリプトが正常に終了して、異常 ( エラー ) が発生した場合は exit 1 を返すと解説しましたが、これは厳密に言えば間違いです。正しくは「異常が発生した場合は exit 値に 1 以上の値を返す」が正しいです。
また、「exit 値に 1 以上の値を返す」というのが理解し辛い所であり、通常利用の範囲でしたらそのまま exit 値には 1 を渡しても問題はないかと思います。 ( 私はプログミングは全然わからないのでそれは間違いだ、と言う場合は指摘してください )


しかし、上記の理屈でいくと exit 64 でもいいじゃん、という訳になってしまいます。が、そうは問屋が卸しません。というより、さりげなくこういった記述を追記してくれた id:hiro-ueda 様の心意気を無碍に扱う訳にはいきません。おまえの妄想だよとか言うな。


ということで ? 早速 exit 値について改めて調べなおしてみたのですが、 exit 値は sysexits(3) で定義されているものを使用するのが良いらしいです。

     style(9) によれば、プログラムを終了するときに失敗の状態を示すために任意の
     値で exit(3) を呼び出すのはよい方法ではありません。代りに、 sysexits から
     の事前に定義された終了コードを使うべきであり、そうすればプロセスの呼び出
     し者はソースコードを調べなくても失敗クラスをおおよそ推定できます。

     無事に終了したことは、常にステータス 0 または EX_OK によって示されます。
     任意のプログラムが既に返している可能性のあるその他の終了ステータスと衝突
     する可能性を減らすために、エラー番号は EX__BASE から始まります。コードの
     意味は、おおよそ次に示す通りです。

     EX_USAGE (64)         コマンドが不正に使用されました。例えば、引数の数の
                           誤り、誤ったフラグ、パラメータの誤った構文など。

FreeBSD 日本語マニュアル検索
より一部抜粋。


プログラミング関係だと少し話は違ってくると思いますが、とりあえず異常終了した場合の exit 値は 1 以上ということで覚えておけば問題ないと思います。詳しく調べたい方は sysexits(3) をご覧下さい。


次に id:cocelo:20060713:1152782079 のコメントで id:hiro-ueda 様が portsnap -I update について仰っていた事ですが、正直私はよくわかりません。
こちらは ports についてと portsnap について調べてからポストします。


とりあえずこんな所でしょうか。
今回は exit 値について調べなおしましたが、これはプログラミングをやっている方でないとわからない事かもしれません。というより私がわかりませんでした。orz
たかが exit 。されど exit 。本当に *nix というか、プログラミングは奥が深いです。