為什麼’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* ...] {} +
… 只有緊跟在僅包含兩個字元“
{}
”的參數之後的 <plus-sign> 才能標出主要表達式的結尾。<加號> 的其他用途不應被視為特殊。換句話說,當使用 時
+
,命令需要以 結尾{} +
。為什麼是這樣?為什麼只有 the
+
而不是 the;
?起初我想可能是為了避免與包含 a 的文件名發生衝突+
,但是帶有 a 的文件名;
似乎可以正常工作?我很難相信這個限制是任意的……
POSIX 規範中給出的基本原理是:
採用的
"-exec ... {} +"
語法是 IEEE PASC 解釋 1003.2 #210 的結果。應該注意的是,這是對 ISO/IEC 9899:1999 標準的不兼容更改。例如,'-'
如果是正常文件,則以下命令列印名稱後帶有 a 的所有文件,'+'
否則列印 a:find / -type f -exec echo {} - ';' -o -exec echo {} + ';'
更改使這樣的用法無效。儘管以前的標準聲明這種用法會起作用,但實際上許多人並不支持它,標准開發人員認為現在聲明這是不允許的更好。
PASC 解釋 1003.2 #210更詳細地介紹了
-exec … {} +
. 在被 POSIX 採用之前,它存在於幾個 Unix 系統上;缺陷報告將其追溯到SVR4(它在很大程度上沒有記錄在案)。缺陷報告證明不兼容的更改在實踐中幾乎沒有影響:請注意,只有緊跟在“{}”之後的“+”才被視為特殊符號。這最大限度地減少了現有使用“+”作為“-exec”的參數引起問題的可能性。
儘管添加對 的支持
-exec … {} +
會破壞一些符合標準的應用程序,例如上面的範例,但這些應用程序的數量比-exec … {} … +
允許的要少。也許,限制
{}
為最後一個論點的另一個原因是易於實施。如果{}
允許在參數列表中的任何位置到-exec
,則find
程序必須通過複製靜態參數,然後是變數部分,然後是另一個靜態部分來建構命令行。這將使構造參數列表和考慮大小限制變得更加困難。難度很小,但實施者喜歡偷工減料。支持多個可替代的實例{}
(如果-exec {} foo +
要工作,從邏輯上也可以預期-exec {} foo {} +
)將變得更加困難。