[Armadillo:08399] Re: testコマンド構文について

Ken-ichi Suzuki email@hidden
2012年 11月 2日 (金) 18:23:18 JST


  東北工大の鈴木です.

> From: "Yanagihara, Kosaku" <email@hidden>
> Date: Fri, 2 Nov 2012 15:59:58 +0900
> 
> Makefileの中に散見される
> 	[ ! -d $$i ] || make -C $$i
> のような構文は、
> 	[ -d $$i ] && make -C $$i
> と同じ意味だとおもうのですが、なぜ否定(!)の否定(||)で記述されているので
> しょうか?

  || は否定ではなく or ですね.

> 最初、意味が(論理がまわりくどくて)分からなかったのですが、新たにMakefile
> に追記していく場合、記述スタイルを揃える事以外に、同じ構文をとるべき必然性
> はありますか?
> 
> 例えば&&の記法では、誤動作するとか・・・!?

  make は,他に指定がなければ,実行するコマンドがエラー(返り値0以外)に
なったとき,ただちに止まります.

  したがって,ディレクトリ $$i が存在しなかった場合には,

	[ -d $$i ] && make -C $$i

では,[ -d $$i ] が 1 を返した時点でこの行はエラーとみなされますので,
make が止まります.

  一方,

 	[ ! -d $$i ] || make -C $$i

であれば,$$i が(ディレクトリとして)存在しなかったら

[ ! -d $$i ] → 0 (成功)を返すので,エラーにならず次に進める.

ですし,$$i が存在する場合には,

[ ! -d $$i ] → 1 (失敗)を返すが,make -C $$i が失敗しなければ,エラー
にならず次に進める.

ということで,どちらの場合でも大丈夫になります.

  あるいは,

 && で結合した場合,失敗した時点で止まる.
 || で結合した場合,成功するまでは,とにかく進む.

と見てもらうと良いかもしれません.

-- 
鈴木  健一 | 東北工業大学情報通信工学科
email@hidden
Tel: 022-305-3426
Fax: 022-305-3402



armadillo メーリングリストの案内