ความแตกต่างระหว่าง“ xargs” และการทดแทนคำสั่ง?


14

xargsในหลายกรณีผมใช้แทนคำสั่งแทน ตัวอย่างเช่นrm $(ls)เดียวกับls | xargs rm

อะไรคือความแตกต่างระหว่างพวกเขาจริง ๆ ?

ฉันคิดว่าหนึ่งในความแตกต่างคือการทดแทนคำสั่งที่ทำงานใน subshell ในขณะที่xargsทำงานในเปลือกปัจจุบัน แต่ฉันไม่แน่ใจ

กรุณาระบุความแตกต่าง

คำตอบ:


9

ข้อแตกต่างประการหนึ่งคือเมื่อใช้การทดแทนคำสั่งแทนไพพ์ขนาดของข้อมูลที่ส่งผ่านจะถูก จำกัด ด้วยขนาดของบัฟเฟอร์คำสั่งดังนั้นจึงถูกตัดทอนในบางกรณีโดยไม่มีการเตือน นี่หมายความว่าต้องสร้างเอาต์พุตคำสั่งทั้งหมดและเก็บไว้ในหน่วยความจำก่อนที่จะถูกส่งไปยังคำสั่งถัดไปดังนั้นสำหรับเอาต์พุตขนาดใหญ่คุณสามารถใช้หน่วยความจำได้มากกว่าที่จำเป็น

ปัญหาอีกประการหนึ่งของวิธีแรกคือเอาท์พุทถูกแยกในพื้นที่ว่างดังนั้นคุณไม่สามารถจัดการชื่อไฟล์ที่มีช่องว่างในพวกเขา xargsยังได้รับผลกระทบจากปัญหาช่องว่าง แต่สามารถแก้ไขได้โดยการเปลี่ยนตัวคั่นที่ใช้ หากต้องการจัดการชื่อไฟล์อย่างถูกต้องคุณจะต้องใช้ null ไบต์เป็นตัวคั่นในตัวอย่างที่สอง

ปัญหาที่สามคือ globs จะขยายดังนั้นถ้าไฟล์มีเครื่องหมายดอกจันหรือเครื่องหมายคำถามในชื่อของมันจะมีผลลัพธ์ที่ไม่คาดคิด

คุณสามารถค้นหาการสนทนาที่ดีเกี่ยวกับปัญหาได้ที่นี่: http://mywiki.wooledge.org/ParsingLs

ไวยากรณ์ที่ถูกต้องจะเป็น

echo rm *

หรือถ้าคุณต้องใช้ xargs

find . -maxdepth 1 -print0 | xargs -0 echo rm

ลบออกechoเมื่อผลลัพธ์ถูกต้อง


1
@Sinoosh: xargsยังทำงานใน subshell เนื่องจากไปป์ถ้าคุณเปิดใช้shopt -s lastpipeงานในกรณีนี้มันจะทำงานในเชลล์ปัจจุบัน ฉันไม่คิดว่าการทำงานใน subshell เป็นปัญหา แต่ในกรณีนี้เนื่องจากคุณไม่ได้เปลี่ยนตัวแปรใด ๆ
user000001

1
@Sinoosh: ในการส่งผ่านอาร์กิวเมนต์หนึ่งโดยหนึ่งคุณสามารถใช้ธงเช่น-l find . -maxdepth 1 -print0 | xargs -0 -l rmสำหรับคำถามที่สองคุณไม่สามารถใช้lsกับxargs -0เพราะ ls ไม่ได้แยกเอาต์พุตบน null bute แต่ขึ้นบรรทัดใหม่ (ซึ่งถูกต้องในชื่อไฟล์ BTW)
user000001

1
@Sinoosh: ไม่ใช่ย่อหน้าแรก แต่ย่อหน้าที่สอง: xargs ที่ไม่มี-0ตัวเลือกจะได้รับผลกระทบจากปัญหาช่องว่าง
user000001

1
อ่านman xargsใช้สำหรับการทดสอบไม่ได้echo ให้เราเกินขีด จำกัด ของเชลล์ (บัฟเฟอร์บางอย่างถูก จำกัด ที่ 65K รายชื่อไฟล์ไม่ได้) rmxargs
waltinator

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