'Find -exec cmd {} +' neden '{} +' ile bitmeli?


11

Önsöz: -exec {} \;& arasındaki farkı anlıyorum -exec {} +. Ben de bir sorun yok gibi , ben semantik hakkında sadece merak ediyorum find.


Biten zaman -execile argüman +yerine ;, biz ihtiyacımız vererek bitirmek {} +örneğin:

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

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

Kullanma ;yerine bu örneklerde +eserler cezası (besbelli ama başka bir şey yapar).

Gönderen POSIX'e :

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

... Yalnızca " {}" iki karakterini içeren bir argümanı hemen takip eden bir <plus-ignign> , birincil ifadenin sonunu noktalayacaktır. <plus-ignign> un diğer kullanımları özel olarak ele alınmayacaktır.

Başka bir deyişle, +komutu kullanırken , komutun bitmesi gerekir{} + .

Bu neden? Ve neden sadece +ve değil ;? İlk başta, a içeren adlarla çakışmaları önlemek belki düşündüm +, ancak dosya adları ;iyi çalışıyor gibi görünüyor? Bu sınırlamanın keyfi olduğuna inanmakta zorlanıyorum ...


3
FWIW, POSIX sayfası ayrıca şunu söylüyor The "-exec ... {} +" syntax adopted was a result of IEEE PASC Interpretation 1003.2 #210ve bu belgede daha fazla ayrıntı bulacaksınız, örneğin: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

Yanıtlar:


5

Mantığı POSIX tarifnamede göz önüne alındığında:

"-exec ... {} +"Benimsenen sözdizimi IEEE PASC Tercümanlık 1003,2 # 210 bir sonucuydu. Bunun ISO / IEC 9899: 1999 standardında uyumsuz bir değişiklik olduğuna dikkat edilmelidir. Örneğin, aşağıdaki komut '-', normal dosyalarsa tüm dosyaları adlarından sonra yazdırır , '+'aksi takdirde:

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

Değişiklik bu şekilde kullanımı geçersiz kılar. Önceki standart bu kullanımın işe yarayacağını belirtmesine rağmen, uygulamada birçok kişi bunu desteklemedi ve standart geliştiriciler şimdi buna izin verilmediğini belirtmenin daha iyi olduğunu düşündüler.

PASC Yorumu 1003.2 # 210'un tarihi hakkında daha ayrıntılı olarak ele alınmaktadır-exec … {} + . POSIX tarafından kabul edilmeden önce birkaç Unix sisteminde mevcuttu; kusur raporu onu SVR4'e kadar izler (burada büyük ölçüde belgesizdir). Kusur raporu, uyumsuz değişikliği uygulamada çok az etkisi olduğu gerekçesiyle haklı çıkarır:

"+" Karakterine yalnızca "{}" ifadesini hemen izliyorsa özel muamele edildiğini unutmayın. Bu, "-exec" ile bir argüman olarak "+" nın mevcut kullanımlarında sorunlara neden olma olasılığını en aza indirir.

Her ne kadar destek eklemek -exec … {} +yukarıdaki örnek gibi bazı uygun uygulamaları kıracak olsa da, bunlara -exec … {} … +izin verilenden daha az var .

Belki de {}son argüman olmayı kısıtlamanın bir başka nedeni de uygulama kolaylığıdır. Eğer {}argüman listede herhangi izin verildi -exec, findprogramın statik argümanlar, daha sonra değişken kısım, sonra başka statik parçası kopyalayarak komut hattı inşa etmesi gerekir. Bu, argüman listesini oluşturmayı ve boyut sınırını hesaba katmayı zorlaştırır. Zorluk minimaldir, ancak uygulayıcılar köşeleri kesmeyi sever. Birden fazla yer değiştirebilir örneğini desteklemek {}(eğer -exec {} foo +işe yararsa, mantıklı olarak da beklenebilir -exec {} foo {} +) önemli ölçüde daha zor olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.