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