Tại sao 'find -exec cmd {} +' cần kết thúc bằng '{} +'?


11

Lời nói đầu: Tôi hiểu sự khác biệt giữa -exec {} \;& -exec {} +. Tôi cũng không có vấn đề như vậy , tôi chỉ tò mò về ngữ nghĩa của find.


Khi kết thúc -execđối số bằng +thay vì ;, chúng ta cần kết thúc điều này bằng {} +, ví dụ:

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

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

Sử dụng ;trong các ví dụ này thay vì +hoạt động tốt (nhưng rõ ràng làm một cái gì đó khác).

Từ POSIX :

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

... Chỉ một <dấu cộng> ngay sau một đối số chỉ chứa hai ký tự " {}" sẽ chấm dứt phần cuối của biểu thức chính. Việc sử dụng <dấu cộng> khác sẽ không được coi là đặc biệt.

Nói cách khác, khi sử dụng +, lệnh cần kết thúc bằng {} +.

Tại sao lại thế này? Và tại sao chỉ với +và không ;? Lúc đầu tôi nghĩ có lẽ để tránh xung đột với tên tập tin có chứa a +, nhưng tên tập tin có ;vẻ hoạt động tốt? Tôi thấy khó tin rằng giới hạn này là tùy tiện ...


3
FWIW, trang POSIX cũng nói rằng The "-exec ... {} +" syntax adopted was a result of IEEE PASC Interpretation 1003.2 #210và trong tài liệu đó, bạn sẽ tìm thấy nhiều chi tiết hơn, ví dụ:Note that the "+" is only treated as special if it immediately follows "{}". This minimises the chances of causing problems with existing uses of "+" as an argument with "-exec".
don_crissti

Câu trả lời:


5

Các lý do được đưa ra trong các đặc điểm kỹ thuật POSIX là:

Các "-exec ... {} +"cú pháp thông qua là kết quả của IEEE PASC Giải thích 1003.2 # 210. Cần lưu ý rằng đây là một thay đổi không tương thích với tiêu chuẩn ISO / IEC 9899: 1999. Ví dụ: lệnh sau sẽ in tất cả các tệp có '-'tên sau nếu chúng là các tệp thông thường và '+'nếu không:

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

Sự thay đổi làm mất hiệu lực sử dụng như thế này. Mặc dù tiêu chuẩn trước đó đã tuyên bố rằng việc sử dụng này sẽ hoạt động, nhưng trên thực tế, nhiều người đã không hỗ trợ nó và các nhà phát triển tiêu chuẩn cảm thấy tốt hơn khi nói rằng điều này không được phép.

Giải thích PASC 1003.2 # 210 đi sâu vào chi tiết hơn về lịch sử của -exec … {} +. Nó tồn tại trên một số hệ thống Unix trước khi được POSIX chấp nhận; báo cáo lỗi theo dõi nó trở lại SVR4 (nơi mà phần lớn không có giấy tờ). Báo cáo lỗi cho thấy sự thay đổi không tương thích là có ít tác động trong thực tế:

Lưu ý rằng "+" chỉ được coi là đặc biệt nếu ngay sau "{}". Điều này giảm thiểu khả năng gây ra sự cố với việc sử dụng "+" hiện tại làm đối số với "-exec".

Mặc dù việc thêm hỗ trợ -exec … {} +sẽ phá vỡ một số ứng dụng phù hợp như ví dụ trên, nhưng có ít hơn những ứng dụng này nếu -exec … {} … +được phép.

Một lý do khác, có lẽ, để hạn chế {}trở thành đối số cuối cùng là dễ thực hiện. Nếu {}được phép ở bất cứ đâu trong danh sách đối số -exec, findchương trình sẽ phải xây dựng dòng lệnh bằng cách sao chép các đối số tĩnh, sau đó là phần biến, sau đó là phần tĩnh khác. Điều này sẽ khiến việc xây dựng danh sách đối số trở nên khó khăn hơn và tính đến giới hạn kích thước. Khó khăn là tối thiểu, nhưng người thực hiện muốn cắt góc. Hỗ trợ nhiều trường hợp thay thế của {}(nếu -exec {} foo +là để làm việc, nó có thể được mong đợi một cách hợp lý -exec {} foo {} +cũng sẽ như vậy) sẽ khó khăn hơn đáng kể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.