ทำไม '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 ...] {} +

... เฉพาะ <plus-sign> ที่ตามหลังอาร์กิวเมนต์ที่มีเพียงอักขระสองตัวเท่านั้น " {}" เท่านั้นที่จะคั่นจุดสิ้นสุดของนิพจน์หลัก การใช้งาน <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 ตัวอย่างเช่นคำสั่งต่อไปนี้พิมพ์ไฟล์ทั้งหมดด้วย'-'หลังชื่อหากเป็นไฟล์ปกติและ a '+':

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

การเปลี่ยนแปลงจะทำให้การใช้งานเป็นโมฆะเช่นนี้ แม้ว่ามาตรฐานก่อนหน้าระบุว่าการใช้งานนี้จะใช้งานได้ แต่ในทางปฏิบัติหลายคนไม่สนับสนุนและนักพัฒนามาตรฐานรู้สึกว่าดีกว่าที่จะระบุว่าตอนนี้ไม่ได้รับอนุญาต

PASC ตีความ 1003.2 # 210-exec … {} +เข้าไปในรายละเอียดเพิ่มเติมเกี่ยวกับประวัติความเป็นมา มันมีอยู่ในระบบ Unix หลายระบบก่อนที่มันจะถูกนำมาใช้โดย POSIX; รายงานข้อบกพร่องจะติดตามกลับไปที่SVR4 (ซึ่งส่วนใหญ่ไม่มีเอกสาร) รายงานข้อบกพร่องแสดงให้เห็นถึงการเปลี่ยนแปลงที่เข้ากันไม่ได้เนื่องจากมีผลกระทบในทางปฏิบัติน้อย:

โปรดทราบว่า "+" จะถือว่าเป็นพิเศษเฉพาะในกรณีที่มันตามหลัง "{}" ทันที สิ่งนี้จะลดโอกาสในการก่อให้เกิดปัญหากับการใช้ "+" ที่มีอยู่ในปัจจุบันเป็นอาร์กิวเมนต์ด้วย "-exec"

แม้ว่าการเพิ่มการสนับสนุนสำหรับ-exec … {} +จะทำให้แอปพลิเคชันที่สอดคล้องกันบางตัวเช่นตัวอย่างด้านบนมีจำนวนน้อยกว่าที่-exec … {} … +ได้รับอนุญาต

เหตุผลอีกประการหนึ่งที่อาจ จำกัด{}ให้อาร์กิวเมนต์สุดท้ายคือความง่ายในการใช้งาน หาก{}ได้รับอนุญาตที่ใดก็ได้ในรายการอาร์กิวเมนต์ไป-execที่findโปรแกรมจะต้องสร้างบรรทัดคำสั่งโดยการคัดลอกอาร์กิวเมนต์คงที่จากนั้นส่วนตัวแปรแล้วส่วนคงที่อื่น สิ่งนี้จะทำให้การสร้างรายการอาร์กิวเมนต์และการ จำกัด ขนาดทำได้ยากขึ้น ความยากลำบากน้อยที่สุด แต่ผู้ใช้งานต้องการตัดมุม การสนับสนุนอินสแตนซ์ที่ทดแทนกันได้หลายรายการของ{}(หาก-exec {} foo +ต้องทำงานก็สามารถคาดการณ์ได้อย่างมีเหตุผลว่า-exec {} foo {} +จะเช่นกัน) จะยากขึ้นอย่างมีนัยสำคัญ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.