A justificativa fornecida na especificação POSIX é:
The
"-exec ... {} +"
syntax adopted was a result of IEEE PASC Interpretation 1003.2 #210. It should be noted that this is an incompatible change to the ISO/IEC 9899:1999 standard. For example, the following command prints all files with a'-'
after their name if they are regular files, and a'+'
otherwise:find / -type f -exec echo {} - ';' -o -exec echo {} + ';'
The change invalidates usage like this. Even though the previous standard stated that this usage would work, in practice many did not support it and the standard developers felt it better to now state that this was not allowable.
Interpretação PASC 1003.2 # 210 entra em mais detalhes sobre o histórico de -exec … {} +
. Existia em vários sistemas Unix antes de ser adotado pelo POSIX; o relatório de defeitos o rastreia até SVR4 (onde era em grande parte não documentado). O relatório de defeito justifica a alteração incompatível como tendo pouco impacto na prática:
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".
Embora adicionar suporte para -exec … {} +
possa quebrar alguns aplicativos em conformidade, como o exemplo acima, há menos deles do que se -exec … {} … +
fosse permitido.
Outra razão, talvez, para restringir {}
a ser o último argumento é a facilidade de implementação. Se {}
fosse permitido em qualquer lugar na lista de argumentos para -exec
, o programa find
teria que criar a linha de comando copiando os argumentos estáticos, a parte variável e outra parte estática. Isso dificultaria a construção da lista de argumentos e a contabilização do limite de tamanho. A dificuldade é mínima, mas os implementadores gostam de cortar custos. O suporte a múltiplas instâncias substituíveis de {}
(se -exec {} foo +
for funcionar, pode ser logicamente esperado que -exec {} foo {} +
também seria) seria significativamente mais difícil.