[unix] ‘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 ...] {} +

… 두 문자 ” {}” 만 포함하는 인수 바로 뒤에 오는 <plus-sign>만이 기본 표현식의 끝을 잘립니다. <plus-sign>의 다른 용도는 특별하게 취급되지 않습니다.

즉,를 사용할 때 +명령 로 끝나야합니다 {} +.

왜 이런거야? 왜 그런지 +아닌지 ;? 처음에는을 포함하는 +파일 이름과의 충돌을 피할 수 있다고 생각 했지만 파일 이름이 ;잘 작동 하는 것 같습니다. 이 제한이 임의적이라고 믿기가 어렵습니다 …



답변

근거 는 POSIX 사양에 주어진입니다 :

"-exec ... {} +"채택 된 구문은 IEEE PASC Interpretation 1003.2 # 210의 결과입니다. 이는 ISO / IEC 9899 : 1999 표준과 호환되지 않는 변경 사항입니다. 예를 들어, 다음 명령은 모든 파일이 '-'이름이 일반 파일 인 경우 이름 뒤에 다른 파일을 인쇄합니다 '+'.

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

변경하면 이와 같은 사용법이 무효화됩니다. 이전 표준에서이 사용법이 효과가 있다고 말했지만 실제로는 많은 사람들이이를 지원하지 않았으며 표준 개발자는 이것이 허용되지 않는다고 말한 것이 더 나았습니다.

PASC 해석 1003.2 # 210 의 역사에 대해 자세히 설명합니다 -exec … {} +. POSIX에서 채택하기 전에 여러 유닉스 시스템에 존재했습니다. 결함 보고서는 SVR4 (대부분 문서화되지 않은)로 다시 추적합니다 . 결함 보고서는 실제로 거의 영향을 미치지 않는 호환되지 않는 변경을 정당화합니다.

“+”는 “{}”바로 뒤에 오는 경우에만 특수한 것으로 취급됩니다. 이렇게하면 “-exec”의 인수로 기존 “+”를 사용할 때 문제가 발생할 가능성이 최소화됩니다.

지원을 추가하면 -exec … {} +위의 예와 같은 일부 응용 프로그램이 중단 되지만 -exec … {} … +허용되는 것보다 적은 수의 응용 프로그램이 있습니다 .

아마도 {}마지막 주장 으로 제한해야하는 또 다른 이유 는 구현의 용이성 때문입니다. 경우 {}에 인수 목록의 아무 곳이나 허용되었다 -execfind프로그램은 정적 인수, 다음 변수 부분, 다음 다른 정적 인 부분을 복사하여 명령 줄을 구축해야합니다. 따라서 인수 목록을 구성하고 크기 제한을 설명하기가 더 어려워집니다. 어려움은 최소화되지만 구현자는 모서리를 자르는 것을 좋아합니다. 대체 가능한 여러 인스턴스를 지원하는 {}경우 ( -exec {} foo +논리적으로 예상되는 경우 논리적으로 기대할 수 있음 -exec {} foo {} +) 훨씬 더 어려워집니다.


답변