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 というか、プログラミングは奥が深いです。