आप इसके बजाय क्या करना चाहेंगे? बिल्कुल नहीं 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जब ग्लोब मेल नहीं खाता है तो गलत है। 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तो ऊपर दिए गए मामले (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कमांड को निरस्त कर देगा यदि किसी भी ग्लोब का कोई मुकाबला नहीं था (और कम से कम मेल नहीं खाने वाले ग्लोब को दबा देगा) उनमें से एक का कोई मुकाबला नहीं था)। बर्नी खोल से व्यवहार टूट गया था ।