検索動作に関する質問

検索動作に関する質問

findのマニュアルページ、特にチェーンテストの論理演算子の評価順序を説明する部分を復号化することはできません。マニュアルページには次のように記載されています。

 OPERATORS
   Listed in order of decreasing precedence:

   ( expr )
          Force precedence. Since parentheses are special to the shell,
          you will normally need to quote them.
          Many of the examples in this manual page use backslashes
          for this purpose: `\(...\)' instead of `(...)'.

   expr1 expr2
          Two  expressions in a row are taken to be joined with an
          implied -a; expr2 is not evaluated if expr1 is false.

   expr1 -a expr2
          Same as expr1 expr2.

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.


   Please note that -a when specified implicitly (for example by two
   tests appearing without an explicit operator between them) or
   explicitly has higher precedence than -o. This means that 
   find . -name afile -o -name bfile -print will never print afile.

これまではとても素晴らしかったです。私は2つのプログラムをコンパイルしました。

#include <stdio.h>

int main (int argc, char **argv) {
        printf("THIS IS PGM1. I RETURN FALSE.\n");
        return 1;
}

そして

#include <stdio.h>

int main (int argc, char **argv) {
        printf("THIS IS PGM2. I RETURN TRUE.\n");
        return 0;
}

それから私は以下を持っています:

lalev@dragonfly:~/example10$ ls -l
total 32
-rwxrwxr-x 1 lalev lalev 8296 Jan 18 12:16 pgm1
-rw-rw-r-- 1 lalev lalev  112 Jan 18 12:16 pgm1.c
-rwxrwxr-x 1 lalev lalev 8296 Jan 18 12:16 pgm2
-rw-rw-r-- 1 lalev lalev  111 Jan 18 12:16 pgm2.c
-rw-rw-r-- 1 lalev lalev    0 Jan 17 23:10 test1
lalev@dragonfly:~/example10$ find . -exec ./pgm1 \; -o -exec ./pgm2 \; -print
THIS IS PGM1. I RETURN FALSE.
THIS IS PGM2. I RETURN TRUE.
.
THIS IS PGM1. I RETURN FALSE.
THIS IS PGM2. I RETURN TRUE.
./pgm1.c
[...]
lalev@dragonfly:~/example10$

私の例では、 find がマンページで説明したものとは異なり、論理演算子を評価しているようです。左から右に同じ優先順位を-o持ちます。-a私は何を逃したことがありませんか?

ベストアンサー1

テストでは優先順位の違いは表示されません。

find . -exec ./pgm1 \; -print -o -exec ./pgm2 \;

違いを見てください。-a(または演算子なし)はthanにバインドされているため、常に失敗するため、バインドされ評価されません-o-print-exec ./pgm1pgm1

あなたの例で見つけたすべてのファイルに対してfindrunpgm1は失敗し、find演算子の他の分岐が評価されるので、-orunpgm2は成功し、次に-print

おすすめ記事