คุณต้องการให้มันทำอะไรแทน ไม่ได้ทำงานrmเลย (1)? ทำงานด้วย*อาร์กิวเมนต์ที่เป็นตัวอักษรในเชลล์ที่เหมือน Bourne (2)? เรียกใช้โดยไม่มีข้อโต้แย้งเลย (3)?
files=(*(N)); (($#files)) && rm -- $files. หรือ(rm -- *) 2> /dev/nullว่าจะซ่อนข้อผิดพลาดของแท้โดยrmที่จะโง่ คุณสามารถละทิ้งzshข้อผิดพลาด แต่คืนค่า stderr สำหรับrmคำสั่งด้วย(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null. จากนั้นเหมือนshที่zshตอนนี้จำลองสำหรับบรรทัดคำสั่งเดียวนั้นการไม่จับคู่*จะถูกส่งผ่านตามที่เป็นอยู่rmและrmบ่นว่า*ไฟล์นั้นไม่มีอยู่ เราปราบปรามrm's stderr เป็นคุณจะทำอย่างไรในshการปราบปรามที่เกิดข้อผิดพลาดอีกครั้ง แต่ที่โง่มันจะซ่อนข้อผิดพลาดของแท้โดยrmเมื่อเทียบกับข้อผิดพลาดที่เกิดขึ้นโดยการกระทำผิดกฎหมายของshการส่งผ่านตัวอักษรเพื่อ* จะไม่บ่นเกี่ยวกับไฟล์ที่ไม่มีอยู่แต่คุณสามารถทำได้rmrm -f '*'*emulate sh -c 'rm -f -- *'
rm -- *(N). rmจะบ่น แต่เมื่อไม่ได้ผ่านการโต้แย้งใด ๆ แต่อีกครั้งไม่:rm -frm -f -- *(N)
โดยทั่วไปrm -fคือคำสั่งที่คุณต้องการใช้หากคุณต้องการให้ไฟล์ทั้งหมดหายไปและได้รับข้อผิดพลาดหากไฟล์ไม่สามารถลบออกได้หรือ IOW ยังคงอยู่ที่นั่นหลังจากrmส่งคืนแล้ว โดยทั่วไปคุณต้องการใช้-fในสคริปต์เพื่อหลีกเลี่ยงผู้ใช้ที่ได้รับแจ้งภายใต้สถานการณ์บางอย่าง
ที่นี่การโทรหาrmเมื่อ glob ไม่ตรงกันไม่ถูกต้อง sh1พฤติกรรมที่ไม่ถูกต้อง มันไม่เป็นอันตรายต่อรูปแบบที่เหมือน*กัน แต่อย่างใดอย่างหนึ่งการ*.[ch]ส่งผ่าน*.[ch]ตามที่เป็นเมื่อไม่ตรงกันอาจทำให้*.[ch]ไฟล์ถูกลบโดยไม่ได้ตั้งใจ:
$ ls
*.[ch] foo.txt
$ zsh -c 'rm *.[ch]'
zsh:1: no matches found: *.[ch]
$ ls
*.[ch] foo.txt
$ sh -c 'rm *.[ch]'
$ ls
foo.txt
ความล้มเหลวที่มีข้อผิดพลาดเป็นสิ่งที่เหมาะสมที่สุดที่จะทำและเป็นสิ่งที่zsh(และfish, csh, tcsh, bash -o failglobและเดิมเชลล์ยูนิกซ์) ไม่
และถ้าคุณต้องการที่จะดูแลตัวเองในกรณีพิเศษนั้นzshทำให้มันง่ายขึ้นด้วย(N)คุณสมบัติรอบตัว (สำหรับnoglob ) เช่นในกรณีที่ (1) ด้านบน fish(อย่างน้อยในเวอร์ชันล่าสุด ) ทำให้ง่ายยิ่งขึ้นเนื่องจากทำnoglobโดยนัยสำหรับsetคำสั่ง ดังนั้นสิ่งที่เทียบเท่าจะเป็น:
set files *
if count $files > /dev/null
rm -f -- $files
end
ดูทำไม nullglob ไม่เริ่มต้นสำหรับรายละเอียดเพิ่มเติม
1 . พูดอย่างเคร่งครัดมันเป็นเพียงแค่shเปลือก Bourne (ตั้งแต่ Unix V7 ในปี 1979); เวอร์ชันก่อนหน้าของsh(ซึ่งเรียก/etc/globใช้ wildcard ที่ไม่ได้กล่าวถึงซึ่งเป็นที่มาของชื่อglob ) ทำตัวเหมือนcshหรือzsh -o cshnullglobว่า/etc/globจะยกเลิกคำสั่งถ้าไม่มี globs ใด ๆ ที่ตรงกัน (และจะระงับ globs ที่ไม่ตรงกันถ้าอย่างน้อย หนึ่งในนั้นมีการแข่งขันใด ๆ ) พฤติกรรมถูกทำลายโดยเชลล์เป้าหมาย