찾기 동작에 관한 질문

찾기 동작에 관한 질문

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 ./pgm1pgm1

귀하의 예에서 찾은 모든 파일에 대해 findrun pgm1은 실패하고 find연산자의 다른 분기가 평가되므로 -orun 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보다 더 많이 바인딩됩니다".

관련 정보