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 ./pgm1
pgm1
あなたの例で見つけたすべてのファイルに対してfind
runpgm1
は失敗し、find
演算子の他の分岐が評価されるので、-o
runpgm2
は成功し、次に-print
。
答え2
find . -exec ./pgm1 \; -o -exec ./pgm2 \; -print
|---expr1-----| |----expr2------------|
終了コードpgm1
は常に1これはexpr1が偽であることを意味します。マニュアルページによると、expr2が評価され、この場合も同様ですfind
。pgm2
それで両方とも処刑されpgm1
ましたpgm2
。
答え3
要約すると、今回理解していることを確認するために、findは常にコマンドラインを「左」と「右」の2つの部分に分割するように述語を評価します。演算子優先順位は分割方法を決定するときに制御権を持ち、線は最も優先順位の低い演算子で分割されます。次に、左側の部分を最初に実行し、右側の部分を最後に実行します。各部分に論理演算子で連結された述部が2つ以上ある場合は、同じ方法で再帰的に実行されます。
答え4
したがって、基本的に-andの優先順位が高いということは、最初に実行されるという意味ではなく、最後に実行されるという意味です。つまり、「-aは-oよりも多くバインドされます」。