आप इसके बजाय क्या करना चाहेंगे? बिल्कुल नहीं rm
(1)? इसे *
अन्य बॉर्न-जैसे गोले (2) की तरह शाब्दिक तर्क के साथ चलाएं ? इसे बिना किसी तर्क के चलाएं (3)?
files=(*(N)); (($#files)) && rm -- $files
। या (rm -- *) 2> /dev/null
लेकिन यह भी वास्तविक त्रुटियों को छिपाएगा rm
जिसके द्वारा मूर्खतापूर्ण होगा। आप zsh
त्रुटि को छोड़ सकते हैं, लेकिन rm
कमांड के लिए stderr को पुनर्स्थापित कर सकते हैं(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null
। फिर जैसे sh
कि zsh
अब उस एकल कमांड लाइन के लिए अनुकरण किया जाता है, गैर-मिलान के *
रूप में पारित किया जाता है rm
और rm
शिकायत करता है कि *
फ़ाइल मौजूद नहीं है। rm
जैसा कि आप sh
उस त्रुटि संदेश को दबाने के लिए करते हैं, हम ऐसा करने के लिए प्रयास करेंगे , लेकिन फिर से, यह मूर्खतापूर्ण है क्योंकि यह वास्तविक त्रुटियों को छिपाएगा, rm
क्योंकि sh
शाब्दिक रूप *
से पारित होने के दुर्व्यवहार के कारण हुई त्रुटि rm
। हालाँकि, rm -f '*'
एक अन-मौजूदा *
फ़ाइल के बारे में कोई शिकायत नहीं करेगा , इसलिए आप ऐसा कर सकते हैंemulate sh -c 'rm -f -- *'
rm -- *(N)
। rm
हालांकि जब किसी भी तर्क पारित नहीं शिकायत करेगा, हालांकि फिर से, नहीं rm -f
: rm -f -- *(N)
।
आम तौर पर, rm -f
वह कमांड है जिसका आप उपयोग करना चाहते हैं यदि आप चाहते हैं कि सभी फाइलें चली गई हैं और केवल एक त्रुटि मिलती है यदि फाइलें नहीं निकाली जा सकती हैं या rm
वापस आने के बाद भी IOW हैं । आप आमतौर पर -f
स्क्रिप्ट में उपयोग करना चाहते हैं ताकि उपयोगकर्ता को कुछ स्थितियों के तहत संकेत दिया जा सके।
यहाँ, rm
जब ग्लोब मेल नहीं खाता है तो गलत है। 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
तो ऊपर दिए गए मामले (1) की तरह अपने (N)
ग्लोब क्वालिफायर ( नोग्लोब के लिए ) को आसान बनाता है । fish
(कम से कम हाल के संस्करण में ) इसे और भी आसान बनाता है क्योंकि यह कमांड के लिए एक अंतर्निहित नोग्लोब करता है set
। तो, वहाँ के बराबर होगा:
set files *
if count $files > /dev/null
rm -f -- $files
end
देखें कि अधिक विवरण के लिए nullglob डिफ़ॉल्ट क्यों नहीं है ।
1 है । सख्ती sh
से यह बोर्न शेल (1979 में यूनिक्स V7 के बाद से) के बाद से ही बोल रहा है ; पहले के संस्करणों sh
(जिसमें /etc/glob
अनकॉल्ड वाइल्डकार्ड्स पर कॉल किया गया था , जहां ग्लोब नाम आता है) ने ऐसा व्यवहार किया csh
या zsh -o cshnullglob
, कि /etc/glob
कमांड को निरस्त कर देगा यदि किसी भी ग्लोब का कोई मुकाबला नहीं था (और कम से कम मेल नहीं खाने वाले ग्लोब को दबा देगा) उनमें से एक का कोई मुकाबला नहीं था)। बर्नी खोल से व्यवहार टूट गया था ।