「find -exec cmd {} +」が「{} +」で終わる必要があるのはなぜですか?


11

序文:-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 ...] {} +

... 2つの文字 " {}" のみを含む引数の直後に続く<plus-sign>のみが、1次式の終わりを区切ります。<plus-sign>の他の使用は、特別なものとして扱われません。

つまり、を使用する+場合、コマンドで終わる必要があります{} +

どうしてこれなの?そして、なぜだけで+なく;?最初に私には含まれていたファイル名との競合を避けるためにおそらく考え+ではなく、ファイル名を;作業罰金に思えますか?この制限が恣意的であるとは信じがたいです...


3
FWIW、POSIXページにもThe "-exec ... {} +" syntax adopted was a result of IEEE PASC Interpretation 1003.2 #210、その詳細が記載されていると記載されています。例: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

回答:


5

根拠 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 … {} … +が、許可されている場合よりも少なくなります。

おそらく、{}最後の議論に限定するもう1つの理由は、実装の容易さです。{}がへの引数リストの任意の場所で許可されている場合-execfindプログラムは、静的引数、次に変数部分、次に別の静的部分をコピーしてコマンドラインを構築する必要があります。これにより、引数リストの作成とサイズ制限の説明が難しくなります。困難は最小限ですが、実装者は手抜きを好みます。の複数の置換可能なインスタンスをサポートすることは{}(もし機能するのであれば-exec {} foo +、論理的に期待できますが-exec {} foo {} +)、かなり困難になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.