'find -exec cmd {} +'가 '{} +'로 끝나야 하는 이유는 무엇입니까?

'find -exec cmd {} +'가 '{} +'로 끝나야 하는 이유는 무엇입니까?

-exec {} \;머리말: & 의 차이점을 이해합니다 -exec {} +. 나도 문제없어이와 같이, 의미론이 궁금합니다 find.


-exec논쟁을 끝내지 않고 사용할 때 우리는+;필요이 작업을 종료하려면 {} +다음과 같이 하세요.

# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"

# GNU find is even more cryptic:
$ find: missing argument to `-exec'

;대신 에 이 예제를 사용하면 +문제 없이 작동합니다(그러나 분명히 다른 작업도 수행합니다).

~에서POSIX:

-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +

...두 문자 ""만 포함하는 인수 바로 뒤에 있는 <더하기 기호>만 {}주 표현식의 끝을 강조합니다. <더하기 기호>의 다른 용도는 특별한 용도로 간주되어서는 안 됩니다.

즉, 사용되면 +명령은필요으로 끝나다 {} +.

왜 이런거야? 왜 +대신에 the를 사용합니까 ;? 처음에는 가 포함된 파일 이름과의 충돌을 피하기 위한 것이라고 생각했지만 가 +포함된 파일 이름은 ;제대로 작동하는 것 같습니까? 이 제한이 임의적이라고 믿기 어렵습니다 ...

답변1

이것이유POSIX 사양에 제공된 내용은 다음과 같습니다.

사용된 구문은 "-exec ... {} +"IEEE PASC 해석 1003.2 #210의 결과입니다. 이는 ISO/IEC 9899:1999 표준과 호환되지 않는 변경 사항이라는 점에 유의해야 합니다. 예를 들어, '-'다음 명령은 일반 파일인 경우 파일 뒤에 이름이 있는 모든 파일을 인쇄하고, '+'그렇지 않으면 인쇄합니다.

find / -type f -exec echo {} - ';' -o -exec echo {} + ';'

이 변경으로 인해 그러한 사용이 무효화됩니다. 이전 표준에서는 이러한 사용이 허용된다고 명시되어 있었지만 실제로는 많은 사람들이 이를 지원하지 않았으며 표준 개발자는 지금은 허용되지 않는다고 명시하는 것이 최선이라고 생각했습니다.

PASC 설명 1003.2 #210역사에 대해 더 자세히 알아보세요 -exec … {} +. POSIX에서 채택되기 전에 여러 Unix 시스템에 존재했습니다.SVR4(기본적으로 문서화되지 않았습니다). 버그 보고서에 따르면 호환되지 않는 변경 사항은 실제로 거의 영향을 미치지 않습니다.

"{}" 바로 다음의 "+"만 특수 문자로 간주됩니다. 이는 "-exec" 인수로 "+"를 사용하여 발생하는 기존 문제의 가능성을 최소화합니다.

지원을 추가하면 -exec … {} +일부 호환 애플리케이션(예: 위의 예)이 중단되지만 이러한 애플리케이션의 수는 -exec … {} … +허용되는 것보다 적습니다.

아마도 {}마지막 주장으로 제한하는 또 다른 이유는 구현의 용이성 때문일 것입니다. {}매개변수 목록의 어디에서나 to가 허용되는 경우 프로그램은 정적 매개변수, 변수 섹션, 또 다른 정적 섹션을 복사하여 명령줄을 작성해야 합니다 -exec. find이로 인해 매개변수 목록을 작성하고 크기 제약 조건을 고려하는 것이 더 어려워집니다. 난이도는 미미하지만 구현자는 지름길을 선호합니다. 여러 대체 가능한 인스턴스를 지원하는 것은 {}( -exec {} foo +가능하고 논리적으로 -exec {} foo {} +예상되는 경우) 더 어려울 것입니다.

관련 정보