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
。