찾기 동작에 대한 질문

찾기 동작에 대한 질문

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.

귀하의 예에서는 찾은 모든 파일에 대해 findrunning pgm1, 실패하여 연산자 find의 다른 분기를 평가하게 되므로 -orunning pgm2, 성공하고 -print.

답변2

find . -exec ./pgm1 \; -o -exec ./pgm2 \; -print
       |---expr1-----|    |----expr2------------|

종료 코드는 pgm1항상1이는 expr1이 거짓임을 의미합니다. 매뉴얼 페이지에 따르면 이 경우에는 findexpr2를 평가합니다 pgm2.

그래서 둘 다 pgm1처형 pgm2되었습니다.

답변3

이번에 알아냈는지 확인하기 위해 다시 한 번 요약하면 find는 항상 명령줄을 "왼쪽"과 "오른쪽" 부분 두 개로 나누는 방식으로 조건자를 평가합니다. 분할 방법을 결정할 때 연산자 우선 순위가 제어권을 가지며 우선 순위가 가장 낮은 연산자에서 줄이 분할됩니다. 그런 다음 왼쪽 부분이 먼저 실행되고 최종적으로 오른쪽 부분이 실행됩니다. 그리고 각 부분에 논리 연산자로 결합된 두 개 이상의 술어가 있는 경우 동일한 방식으로 재귀적으로 실행됩니다.

답변4

따라서 기본적으로 -and의 우선 순위가 높다는 것은 먼저 실행된다는 의미가 아니라 마지막에 실행된다는 의미입니다. 즉 "-a는 -o보다 더 많이 바인딩됩니다"입니다.

관련 정보