csh - if 文では条件式の評価よりも前にコマンドが展開される
csh の if 文では、コマンドの展開が評価よりも前に行われることを覚えておきたい。
とあるスクリプトで、ディレクトリの存在チェックと、そのディレクトリ内に含まれるファイル数の判定を、次のように一つの if 文で行っていた。
if ( -e /path/to/directory && `ls -1 /path/to/directory | wc -l` == 0 ) then
このディレクトリを消したところ、「No such file or directory」と出力されてしまった。
一つ目の条件(`-e /path/to/directory`)でディレクトリの存在チェックをしているので、もしディレクトリがなければ二つ目の条件判定は実行されないと思っていたが、どうやら違うらしい。
if 文では式の評価の前にコマンドが展開される。
つまり今回の場合、次の流れで処理が行われる。
コマンド(`ls -1 /path/to/directory | wc -l`)を展開
ディレクトリの存在チェック(`-e /path/to/directory`)
ディレクトリが存在するなら、「最初に展開したコマンドの結果 == 0」を評価
よってディレクトリが存在しない場合、`ls -1 /path/to/directory` で「No such file or directory」のエラーが起きるというわけである。
なので、黙って if 文を2つに分けることにした。
これならディレクトリが存在するときだけファイル数をカウントするので問題ないだろう。
if ( -e /path/to/directory ) then
if ( `ls -1 /path/to/directory | wc -l` == 0 ) then