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.
지금까지는 매우 훌륭했습니다. 저는 두 가지 프로그램을 컴파일했습니다.
#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
run pgm1
은 실패하고 find
연산자의 다른 분기가 평가되므로 -o
run pgm2
은 성공하고 그 다음에는 -print
.
답변2
find . -exec ./pgm1 \; -o -exec ./pgm2 \; -print
|---expr1-----| |----expr2------------|
종료 코드 pgm1
는 항상1이는 expr1이 거짓임을 의미합니다. 매뉴얼 페이지에 따르면 expr2가 평가될 것이며 이 경우에도 마찬가지입니다 find
.pgm2
그래서 둘 다 처형 pgm1
당했습니다 pgm2
.
답변3
다시 요약하자면, 이번에 이해했는지 확인하기 위해 find는 항상 명령줄을 "왼쪽"과 "오른쪽" 부분의 두 부분으로 분할하는 방식으로 조건자를 평가합니다. 연산자 우선순위는 분할 방법을 결정할 때 제어권을 가지며, 선은 우선순위가 가장 낮은 연산자에서 분할됩니다. 그런 다음 왼쪽 부분을 먼저 실행하고 오른쪽 부분을 마지막으로 실행합니다. 각 부분에 논리 연산자로 연결된 술어가 2개 이상 있으면 동일한 방식으로 재귀적으로 실행됩니다.
답변4
따라서 기본적으로 -and의 우선 순위가 높다는 것은 먼저 실행된다는 의미가 아니라 마지막으로 실행된다는 의미입니다. 즉 "-a는 -o보다 더 많이 바인딩됩니다".