検索動作に関する質問

検索動作に関する質問

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

答え2

find . -exec ./pgm1 \; -o -exec ./pgm2 \; -print
       |---expr1-----|    |----expr2------------|

終了コードpgm1は常に1これはexpr1が偽であることを意味します。マニュアルページによると、expr2が評価され、この場合も同様ですfindpgm2

それで両方とも処刑されpgm1ましたpgm2

答え3

要約すると、今回理解していることを確認するために、findは常にコマンドラインを「左」と「右」の2つの部分に分割するように述語を評価します。演算子優先順位は分割方法を決定するときに制御権を持ち、線は最も優先順位の低い演算子で分割されます。次に、左側の部分を最初に実行し、右側の部分を最後に実行します。各部分に論理演算子で連結された述部が2つ以上ある場合は、同じ方法で再帰的に実行されます。

答え4

したがって、基本的に-andの優先順位が高いということは、最初に実行されるという意味ではなく、最後に実行されるという意味です。つまり、「-aは-oよりも多くバインドされます」。

関連情報