ข้อแตกต่างประการหนึ่งคือเมื่อใช้การทดแทนคำสั่งแทนไพพ์ขนาดของข้อมูลที่ส่งผ่านจะถูก จำกัด ด้วยขนาดของบัฟเฟอร์คำสั่งดังนั้นจึงถูกตัดทอนในบางกรณีโดยไม่มีการเตือน นี่หมายความว่าต้องสร้างเอาต์พุตคำสั่งทั้งหมดและเก็บไว้ในหน่วยความจำก่อนที่จะถูกส่งไปยังคำสั่งถัดไปดังนั้นสำหรับเอาต์พุตขนาดใหญ่คุณสามารถใช้หน่วยความจำได้มากกว่าที่จำเป็น
ปัญหาอีกประการหนึ่งของวิธีแรกคือเอาท์พุทถูกแยกในพื้นที่ว่างดังนั้นคุณไม่สามารถจัดการชื่อไฟล์ที่มีช่องว่างในพวกเขา xargs
ยังได้รับผลกระทบจากปัญหาช่องว่าง แต่สามารถแก้ไขได้โดยการเปลี่ยนตัวคั่นที่ใช้ หากต้องการจัดการชื่อไฟล์อย่างถูกต้องคุณจะต้องใช้ null ไบต์เป็นตัวคั่นในตัวอย่างที่สอง
ปัญหาที่สามคือ globs จะขยายดังนั้นถ้าไฟล์มีเครื่องหมายดอกจันหรือเครื่องหมายคำถามในชื่อของมันจะมีผลลัพธ์ที่ไม่คาดคิด
คุณสามารถค้นหาการสนทนาที่ดีเกี่ยวกับปัญหาได้ที่นี่: http://mywiki.wooledge.org/ParsingLs
ไวยากรณ์ที่ถูกต้องจะเป็น
echo rm *
หรือถ้าคุณต้องใช้ xargs
find . -maxdepth 1 -print0 | xargs -0 echo rm
ลบออกecho
เมื่อผลลัพธ์ถูกต้อง
xargs
ยังทำงานใน subshell เนื่องจากไปป์ถ้าคุณเปิดใช้shopt -s lastpipe
งานในกรณีนี้มันจะทำงานในเชลล์ปัจจุบัน ฉันไม่คิดว่าการทำงานใน subshell เป็นปัญหา แต่ในกรณีนี้เนื่องจากคุณไม่ได้เปลี่ยนตัวแปรใด ๆ