คุณต้องการให้มันทำอะไรแทน ไม่ได้ทำงาน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
การส่งผ่านตัวอักษรเพื่อ*
จะไม่บ่นเกี่ยวกับไฟล์ที่ไม่มีอยู่แต่คุณสามารถทำได้rm
rm -f '*'
*
emulate sh -c 'rm -f -- *'
rm -- *(N)
. rm
จะบ่น แต่เมื่อไม่ได้ผ่านการโต้แย้งใด ๆ แต่อีกครั้งไม่:rm -f
rm -f -- *(N)
โดยทั่วไปrm -f
คือคำสั่งที่คุณต้องการใช้หากคุณต้องการให้ไฟล์ทั้งหมดหายไปและได้รับข้อผิดพลาดหากไฟล์ไม่สามารถลบออกได้หรือ IOW ยังคงอยู่ที่นั่นหลังจากrm
ส่งคืนแล้ว โดยทั่วไปคุณต้องการใช้-f
ในสคริปต์เพื่อหลีกเลี่ยงผู้ใช้ที่ได้รับแจ้งภายใต้สถานการณ์บางอย่าง
ที่นี่การโทรหาrm
เมื่อ glob ไม่ตรงกันไม่ถูกต้อง sh
1พฤติกรรมที่ไม่ถูกต้อง มันไม่เป็นอันตรายต่อรูปแบบที่เหมือน*
กัน แต่อย่างใดอย่างหนึ่งการ*.[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 ที่ไม่ตรงกันถ้าอย่างน้อย หนึ่งในนั้นมีการแข่งขันใด ๆ ) พฤติกรรมถูกทำลายโดยเชลล์เป้าหมาย