कारण noclobber
डिफ़ॉल्ट रूप से सेट नहीं किया गया है परंपरा है। उपयोगकर्ता इंटरफ़ेस डिज़ाइन के एक मामले के रूप में, "इस नई फ़ाइल को बनाना" आसान क्रिया है और अतिरिक्त खतरनाक बाधा डालने के लिए "या तो एक नई फ़ाइल बनाना या किसी मौजूदा फ़ाइल को अधिलेखित करना" एक अच्छा विचार है। इस प्रकार noclobber
यह एक अच्छा विचार है ( >
एक नई फ़ाइल बनाने के लिए, >|
किसी मौजूदा फ़ाइल को संभावित रूप से अधिलेखित करने के लिए) और यह संभवतः डिफ़ॉल्ट होगा यदि शेल कुछ दशकों बाद डिज़ाइन किया गया था।
मैं आपकी इंटरेक्टिव शेल स्टार्टअप फ़ाइल ( .bashrc
या .zshrc
) में निम्नलिखित का उपयोग करने की दृढ़ता से सलाह देता हूं :
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
प्रत्येक मामले में (रीडायरेक्शन, कॉपी, मूविंग), लक्ष्य एक अतिरिक्त बाधा को जोड़ना है जब ऑपरेशन में कुछ मौजूदा डेटा को मिटाने का दुष्प्रभाव हो सकता है, भले ही मौजूदा डेटा को मिटा देना ऑपरेशन का प्राथमिक लक्ष्य नहीं है। मैं rm -i
इस सूची में नहीं डालता क्योंकि डेटा को मिटाना प्राथमिक लक्ष्य है rm
।
ध्यान दें कि क्या noclobber
और -i
कर रहे हैं सुरक्षा जाल । यदि वे ट्रिगर करते हैं, तो आपने कुछ गलत किया है । तो उन्हें एक बहाने के रूप में उपयोग न करें कि आप क्या ओवरराइटिंग कर रहे हैं! मुद्दा यह है कि आपको जाँचना चाहिए कि आउटपुट फ़ाइल मौजूद नहीं है। यदि आपको बताया गया है file exists: foo
या overwrite 'foo'?
, इसका मतलब है कि आपने गलती की है और आपको बुरा महसूस करना चाहिए और अधिक सावधान रहना चाहिए। विशेष रूप से, यह कहने की आदत में मत पड़ो कि y
क्या अधिलेखित करने के लिए प्रेरित किया गया है (यकीनन, उपनाम होना चाहिए alias cp='yes n | cp -i' mv='yes n | mv -i'
, लेकिन दबाने Ctrl+ Cसे आउटपुट बेहतर दिखता है): यदि आप का मतलब ओवरराइट करना है, तो कमांड को रद्द करें, आउटपुट को स्थानांतरित करें या निकालें फ़ाइल, और फिर से कमांड चलाएं।
यह भी महत्वपूर्ण है कि उन सफारी को ट्रिगर करने की आदत न डालें क्योंकि यदि आप करते हैं, तो एक दिन आप एक ऐसी मशीन पर होंगे, जिसमें आपका कॉन्फ़िगरेशन नहीं है, और आप डेटा खो देंगे क्योंकि सुरक्षा आप कर रहे थे। ' टी वहाँ
noclobber
केवल इंटरैक्टिव गोले के लिए सेट किया जाएगा, क्योंकि .bashrc
या .zshrc
केवल इंटरैक्टिव गोले द्वारा पढ़ा जाता है। बेशक आप शेल विकल्पों को इस तरह से नहीं बदल सकते हैं जो लिपियों को प्रभावित करें, क्योंकि यह उन लिपियों को तोड़ सकता है।
rm *
...