वहाँ `noclobber` की स्थापना के कोई नुकसान हैं?


20

यह देखते हुए कि zshकमांड दी गई सभी फाइलों को क्लोब कर सकता है:

>*

मैं सोच रहा हूं कि विकल्प सेट noclobberकरना एक अच्छा विचार होगा।

मैं हमेशा उपयोग कर सकता हूं >| fileयदि मैं बश और zsh दोनों में डिफ़ॉल्ट क्लोबर व्यवहार का उपयोग करना चाहता हूं। (zsh वैकल्पिक सिंटैक्स की भी अनुमति देता है >!file)।

मैं अनुमान लगा रहा हूं कि noclobberPOSIX संगतता के कारण डिफ़ॉल्ट रूप से परेशान है, लेकिन सिर्फ यह सुनिश्चित करने के लिए:

क्या सेटिंग करने के लिए कोई डाउनसाइड है noclobber?

वहाँ वैसे भी noclobberकेवल इंटरेक्टिव शेल के लिए सेट है ?


3
मुझे आश्चर्य है कि zsh कम से कम उस बारे में चेतावनी नहीं देता है, यह देखते हुए कि यह कुछ के बारे में चेतावनी देता है rm *...
ilkachachu

जवाबों:


24

कारण 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केवल इंटरैक्टिव गोले द्वारा पढ़ा जाता है। बेशक आप शेल विकल्पों को इस तरह से नहीं बदल सकते हैं जो लिपियों को प्रभावित करें, क्योंकि यह उन लिपियों को तोड़ सकता है।


6
rmमेरे पास एक विकल्प है -Iजिसका मैं उपयोग करता हूं और सिफारिश करता हूं: "तीन से अधिक फ़ाइलों को हटाने से पहले एक बार संकेत दें, या जब पुनरावृत्ति को हटा दें, तो कम से कम घुसपैठ -i, जबकि अभी भी अधिकांश गलतियों के खिलाफ सुरक्षा दे रहा है"
रीड

9
मैं दृढ़ता से अनुशंसा करता हूं कि इस तरह से cp और mv को फिर से अलियास न करें । हालांकि, -iउनके लिए एक डिफ़ॉल्ट तर्क के रूप में उपयोग करना एक उत्कृष्ट विचार है, लेकिन इसे अलग-अलग उपनामों पर लागू किया जाना चाहिए , न कि मूल (उदाहरण के लिए, जिसे मैंने हमेशा alias copy="cp -i"और alias move="mv -i"मेरे .bashrc में रखा है )। क्यों? विफलता मोड के कारण। जब आप किसी मशीन या अलग-अलग उपयोगकर्ता का उपयोग करते हैं, जिसमें cp / mv उपनाम नहीं होता है? फ़ाइलें संभावित रूप से अनजाने में लिखी गई हैं (संभवतः undetected!)। प्रतिलिपि / चाल उर्फ ​​के साथ विफलता मोड: शेल की शिकायत है कि यह कमांड को नहीं पहचानता है।
५५ पर हवलदार

1
Cp / mv उपनाम के लिए एक अतिरिक्त विफलता मोड भी है: शेल स्क्रिप्ट किसी ऐसे व्यक्ति को लिखते समय जिसका उपयोग cp = "cp -i" के लिए किया जाता है, उपनाम किसी cp कमांड को गलत तरीके से व्यवहार करने की अपेक्षा करते हुए गलत तरीके से लिख सकता है। नाम का अंतर। इसके विपरीत, हर बार जब मैं लिखता हूं "किसी को कॉपी करें / कुछ / जहां मैं जानता हूं कि मैं एक उपनाम का उपयोग करता हूं, न कि सीधे सीपी कमांड का। और यहां तक ​​कि अगर मुझे एक शेल फ़ाइल में एक प्रतिलिपि डालनी चाहिए, तो यह उसी तरह से विफल होगा जैसे लापता उपनाम के साथ शेल के लिए।
५० पर हवलदार

1
तो TL, डॉ। -iCp और mv के लिए तर्क का उपयोग करने के लिए डिफ़ॉल्ट रूप से सलाह उत्कृष्ट है, लेकिन cp और mv नामों का पुन: उपयोग करने की सलाह बुरी तरह से खराब है। यह इतना बुरा है कि मुझे जवाब को एक डाउन वोट देना होगा। कृपया अलग-अलग उपनामों का उपयोग करने के लिए बदलें और मैं इसे एक वोट दूंगा।
०५ पर हवलदार

1
@TomHale आप उपयोग कर सकते हैं alias RM='command rm', जो rmउपनाम को उपनाम के बजाय बाहरी कमांड का उपयोग करने के लिए कहेंगे । इस तरह से आपको --interactive=neverपहले के सुपरस्पेशिंग पर भरोसा करने की ज़रूरत नहीं है -i
Adaephon

6

स्थापना noclobberमें खोल विकल्प ~/.bashrc(के लिए bash) या ~/.zshrc(या अधिक सटीक $ZDOTDIR/.zshrc, के लिए zsh) यह इंटरैक्टिव खोल सत्र में सक्रिय कर देगा।

गैर-संवादात्मक गोले (स्क्रिप्ट) इन फ़ाइलों को नहीं पढ़ते हैं।

शैल विकल्प आमतौर पर मूल शैल से विरासत में नहीं मिले हैं।

इसका मतलब यह है कि आपको मौजूदा स्क्रिप्ट में व्यवहार को संशोधित किए बिना उन फ़ाइलों में विकल्प को सेट करने में सक्षम होना चाहिए, जब तक कि स्क्रिप्ट स्पष्ट रूप से उन फ़ाइलों को स्रोत न करें।

ऐसा करने का एकमात्र नकारात्मक पहलू यह है कि मैं देख सकता हूं कि आप बार-बार भूल जाएंगे कि आपने विकल्प निर्धारित किया है, कम से कम शुरुआत में। बाद में, सभी चीजों के इन प्रकार के साथ के रूप में, आप आदतन उपयोग करना शुरू कर देंगे >|, यहां तक कि उन मामलों में जहां आप वास्तव में फ़ाइल (बस के लिए उपनाम के साथ लोगों की तरह पीटना नहीं चाहते हो सकता है में rm, cpऔर mvसाथ -iविकल्प हमेशा सेट, अंत में हमेशा उपयोग करने के लिए शुरू -fकमांड लाइन पर)।


2
साथ bash, विकल्प विरासत में मिला रहे हैं $SHELLOPTS( $BASHOPTSके लिए shoptवाले) पर्यावरण (नहीं कुछ आप आम तौर पर हालांकि कारण इस तरह का के लिए क्या करना चाहते हैं) में है।
स्टीफन चेजालस

3

नकारात्मक पक्ष यह है कि, यदि आप noclobberसक्रिय होने के अभ्यस्त हो गए हैं, तो आप एक दिन एक ऐसी प्रणाली का उपयोग करेंगे जहां यह सक्रिय नहीं है और आप संभावित रूप से खतरनाक कमांड को अंजाम देंगे, जिससे noclobberआपको बचाने की उम्मीद होगी ... और यह नहीं होगा। और फिर आपको यह उम्मीद करनी होगी कि आपके द्वारा नष्ट किए गए डेटा को पुनर्प्राप्त करने के लिए हाल ही में पर्याप्त बैकअप है क्योंकि आपने माना था कि आपको पहले पुष्टि के लिए कहा जाएगा।


ज़रूर, एक दिन आप एक ऐसी प्रणाली का उपयोग करेंगे जहाँ यह सक्रिय नहीं है। जब आप एक अपरिचित प्रणाली का उपयोग कर रहे हैं, तो आपको विशेष रूप से सावधान रहना चाहिए और यह सुनिश्चित करना चाहिए कि किसी फ़ाइल को रीडायरेक्ट करने के लिए संभावित रूप से विनाशकारी जैसे कुछ भी करने से पहले बैकअप अप-टू-डेट हो।
गाइल्स का SO- बुराई का होना बंद करो '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.