'find -exec cmd {} +'が '{} +'で終わるのはなぜですか?

'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 ...] {} +

...2 つの文字 "" のみを含む引数の直後にある <プラス記号> のみが、メイン式の{}終わりを強調します。 <プラス記号>の他の用途は特別な用途と見なすべきではありません。

つまり、使用されると、+コマンドは必要で終わる{} +

なぜこれですか?なぜ+代わりにtheを使うのですか;?最初はが含まれているファイル名との競合を避けるためのものだと思いましたが、 を含む+ファイル名は;正常に動作するようですか?この制限が任意であるとは信じ難い...

答え1

これ理由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 … {} … +許容されるものより少なくなります。

おそらく{}最後の主張に制限するもう一つの理由は、実装の容易さによるものです。{}パラメータリストのどこからでもtoが許可されている場合、プログラムは静的パラメータ、変数セクション、および他の静的セクションをコピーしてコマンドラインを作成する必要があります-execfindこれにより、パラメータリストを作成し、サイズ制約を考慮するのがより困難になります。難易度はわずかですが、実装者は近道を好みます。複数の代替可能なインスタンスをサポートすることは{}-exec {} foo +可能で論理的に-exec {} foo {} +予想される場合)、より困難になります。

関連情報