बश इतिहास प्रतिस्थापन अभी भी डिफ़ॉल्ट रूप से सक्षम क्यों है? [बन्द है]


17

क्या किसी को पता है कि बैश में अभी भी डिफ़ॉल्ट रूप से इतिहास प्रतिस्थापन क्यों सक्षम है? मेरे कई वर्षों के लिए .bashrcशामिल set +Hकिया गया है लेकिन कुछ अन्य लोग अभी भी इस सुविधा से काट रहे हैं।

यह देखते हुए कि बहुत से हर कोई कॉपी-पेस्ट सुविधाओं के साथ टर्मिनलों का उपयोग कर रहा है औरreadline लाइब्रेरी और इतिहास प्रतिस्थापन के साथ संकलित बैश केवल इंटरैक्टिव गोले में डिफ़ॉल्ट रूप से सक्षम है, क्या वास्तव में सुविधा होने का कोई कारण है? सभी गोले के लिए डिफ़ॉल्ट रूप से अक्षम होने पर भी कोई मौजूदा स्क्रिप्ट नहीं तोड़ी जाएगी।

यदि आप नहीं जानते कि इतिहास प्रतिस्थापन क्यों टूट गया है तो यह कोशिश करें:

$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?

(स्पष्ट रूप से इस सुविधा के प्रमुख मुद्दे हैं यदि यह सभी स्क्रिप्टिंग के लिए डिफ़ॉल्ट रूप से अक्षम है और निष्पादन से पहले परिणामों को सत्यापित करने के लिए एक सुविधा मौजूद है shopt -s histverify।)

यह सभी देखें:


16
आपको लगता है कि लोग इतिहास प्रतिस्थापन का उपयोग नहीं करते हैं। मेरे द्वारा इसे हर दिन उपयोग किया जाता है। मैं जल्दी का पालन करने के लिए मिल ls -l foo/bar/baz/weeble.cppके साथ less !$तुलना में याद आदेश और इसे संपादित करें।
मार्टिन बोनर

2
@MartinBonner तो आप इसे सक्षम कर सकते हैं। सवाल यह है कि यह डिफ़ॉल्ट रूप से क्यों सक्षम है , न कि क्यों यह अभी भी मौजूद है।
बरमार

5
@ बरमार: ज़रूर। लेकिन मेरी बात इस धारणा को चुनौती देने के लिए थी कि इस सवाल का जवाब क्या है।
मार्टिन बोनर

5
यदि हम आपके तर्क का पालन करते हैं, तो भागने या उद्धृत करने वाली किसी भी चीज़ को डिफ़ॉल्ट रूप से अक्षम किया जाना चाहिए। मुझे URL से बचने या उद्धरण की आवश्यकता क्यों होनी चाहिए &? मुझे एक फ़ाइल नाम से बचने या उद्धरण की आवश्यकता क्यों होनी चाहिए ?? ऐसे लोगों के लिए UI हैं जो सोचते हैं कि यह एक समस्या है।
jcaron

3
मैं !$दिन में कई बार उपयोग करता हूं , और !!काफी बार भी। मुझे स्वीकार करना होगा कि मैं अन्य इतिहास प्रतिस्थापनों का उपयोग नहीं करता हूं, लेकिन अगर मैं वर्षों से उपयोग किए जा रहे शेल के डिफ़ॉल्ट व्यवहार को अचानक बदल दिया है तो मैं निश्चित रूप से दुखी होऊंगा।
jcaron

जवाबों:


32

यदि आप पहले से परिचित हैं bash, तो इतिहास प्रतिस्थापन पैटर्न से निपटने के लिए आपको किसी अन्य वर्ण को संभालने की तुलना में अधिक काटने की संभावना नहीं है जो इस शेल के लिए विशेष हैं। हालांकि, यदि कोई शेल से अपरिचित है या उसने कभी अपने इतिहास प्रतिस्थापन सुविधाओं का उपयोग नहीं किया है, तो यह स्पष्ट रूप से आश्चर्यचकित होगा जब प्रतीत होता है कि अहानिकर या अनजाने में डबल-स्ट्रिंग वाले इसे ट्रिगर करते हैं।

सक्षम किए गए इतिहास प्रतिस्थापन के साथ एक इंटरैक्टिव शेल में, !चरित्र बहुत ही उसी तरह $से विशेष है जैसे कि चरित्र विशेष है, यानी हर जगह जब तक कि \या एकल-उद्धृत स्ट्रिंग्स में बच नहीं जाता है।

के $माध्यम से विरोध के रूप में , इतिहास के विकल्प यहां-दस्तावेजों में विस्तार नहीं करते हैं, और चूंकि वे लाइन-ओरिएंटेड हैं, वे अतिरिक्त रूप से उन लाइनों पर होंगे जहां प्रतिस्थापन एक अनछुए संदर्भ या एक दोहरे उद्धरण संदर्भ (उस पंक्ति में अलग से स्कैन किए जाने पर) के भीतर आता है । अधिक जानकारी के लिए यह बग रिपोर्ट देखें

गैर-संवादात्मक गोले (स्क्रिप्ट) में इतिहास प्रतिस्थापन अक्षम है क्योंकि शेल की कमांड इतिहास क्षमता की आवश्यकता नहीं है, इसलिए नहीं कि सुविधा में "प्रमुख मुद्दे" हैं। एक स्क्रिप्ट में, $HISTFILEबिना किसी मतलब के हर कमांड को सेव करना और इसी तरह हिस्ट्री सबस्टेशन एक स्क्रिप्ट पर निर्भर रहना चाहते हैं।

डिफ़ॉल्ट रूप से इसे सक्षम किया जाना चाहिए या नहीं, इंटरैक्टिव गोले में बहस की जा सकती है (हालांकि मैं पूरी तरह से आश्वस्त नहीं हूं कि यहां एक बहस bashडेवलपर्स के लिए बहुत मायने रखती है)। आपको लगता है कि अधिकांश bashउपयोगकर्ताओं को इतिहास के विस्तार में समस्या हो रही है, लेकिन न तो आप और मैं में से कोई भी जानता है कि उनका उपयोग करना कितना आम है।

यूनिक्स के गोले एक व्यक्ति के व्यक्तिगत आवश्यकताओं और स्वाद को फिट करने के लिए शेल के व्यवहार को संशोधित करने की अनुमति देते हैं। यदि आप अपने सभी इंटरैक्टिव गोले के लिए इतिहास के विकल्प को बंद करना चाहते हैं, तो set +Hअपनी ~/.bashrcफ़ाइल में उपयोग के साथ आप जो कर रहे हैं, उसे जारी रखें या bashडिफ़ॉल्ट को बदलने के लिए डेवलपर्स की पैरवी करें (जो, मेरा मानना ​​है कि इससे अधिक लोग भ्रमित और भ्रमित होंगे, इससे मदद मिलेगी )।


2
@MikkoRantalainen आपको लगता है कि इतिहास प्रतिस्थापन कुछ ऐसा नहीं है जिसे अधिकांश bashउपयोगकर्ता उपयोग कर रहे हैं। मुझे नहीं लगता कि हम में से कोई जानता है कि यह कितना सामान्य है। मेरा सुझाव है कि यदि आप इस बारे में दृढ़ता से महसूस करते हैं, तो आप bashमेलिंग सूची में एक सुविधा / बग अनुरोध सबमिट करें । देखें savannah.gnu.org/mail/?group=bash
Kusalananda

8
सही। समस्या वास्तव में इतिहास प्रतिस्थापन के बारे में नहीं है, लेकिन इस तथ्य के बारे में कि बाश में दोहरे "उद्धरण" वास्तव में इस अर्थ में नहीं हैं कि अन्य भाषाएं इस शब्द का उपयोग करती हैं, बल्कि एक विशेष प्रकार के कोष्ठकों की तरह काम करती हैं। @MikkoRantalainen, यह डाल कुछ भी है कि आप बैश में किसी भी विशेष तरीके से व्याख्या करने के लिए नहीं करना चाहते करने के लिए एक आदत बनाने के एकल उद्धरण!
वामावर्तबाउट

5
@leftaroundabout यह इस बात पर निर्भर करता है कि आप व्याख्या करने से क्या मतलब रखते हैं। अधिकांश भाषाएं आउटपुट के लिए स्ट्रिंग्स में नियंत्रण वर्णों की व्याख्या करती हैं (लेकिन प्रदान की जाती हैं, उसी तरह से नहीं जैसे शेल में जब चारों ओर केवल फेरबदल होता है)। पर्ल के उद्धरण नियम अतिरिक्त रूप से शेल (चर प्रक्षेप) की तरह बहुत काम करते हैं। किसी भी प्रोग्रामिंग भाषा के रूप में, यह मदद करता है अगर एक क्या भाषा एक वर्तमान में काम कर रहा है याद करने के लिए सक्षम है।
Kusalananda

5
" मेरी बात यह है कि यह शायद ही कभी विशेष चरित्र का उपयोग किया जाता है " मैं कहूंगा कि यह दूसरा तरीका है ... यह !शायद ही कभी एक सामान्य चरित्र के रूप में उपयोग किया जाता है - जो कि डब्ल्यूटीएफ को एक तरफ गूँज रहा है - पकड़े जाने वाले लोगों की संख्या बहुत अधिक है। इतिहास को स्थानापन्न करने के लिए अभी भी इसका उपयोग करने वाले लोगों की संख्या से।
ट्रिपहाउंड

3
-1 अनुचित उद्धरण पर दोष का बचाव करने के लिए। के बाद से !है नहीं करने के लिए विशेष सबसे बॉर्न की तरह गोले, और न ही में bashस्क्रिप्ट, वहाँ कई रास्ते जिससे लोगों यथोचित सीख सकते हैं कि कर रहे हैं "$my_var some text!!"विस्तार होगा $my_varलेकिन नहीं !!। मैं के साथ बॉर्न की तरह पर खोल परिचित मिल गया busybox ashहै, और के साथ मेरी पहली मुठभेड़ bashइतिहास प्रतिस्थापन था मुझे इसके द्वारा काटा जा रहा है जब मैं एक इंटरैक्टिव खोल में कुछ त्वरित एक लाइनर करने के लिए कोशिश कर रहा था। बोर्न जैसे गोले के पोर्टेबल और स्क्रिप्टिंग उपयोग में कुशल लोगों को अक्सर इसका उपयोग करते समय कम से कम एक बार काट दिया जाता है bash
mtraceur

9

इतिहास प्रतिस्थापन उपयोगी है। उदाहरण के लिए

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.

2
इसलिए? यदि आपको यह उपयोगी लगता है तो आप इसे अपने में सक्षम कर सकते हैं .bashrc
बरमार


3
@ बरमार और यदि आपको यह उपयोगी लगता है तो आप इसे निष्क्रिय कर सकते हैं। अजीब है कि समरूपता कैसे काम करती है।
हॉब्स

3
@ यदि आप नहीं जानते कि यह मौजूद है, तो आप इसे कैसे निष्क्रिय करना चाहेंगे?
बरमार

2
यह उत्तर इस बात की व्याख्या करने का एक अच्छा काम करता है कि फीचर क्यों उपयोगी है। मुझे लगता है कि ओपी यह समझना चाहता है कि यह उपयोगिता इस व्यवहार को सही ठहराने के लिए पर्याप्त क्यों है, भले ही ओपी (और अन्य, जैसे कि लोग इस स्टैकटेक्चेंज पर संबंधित कई सवाल पूछ रहे हैं) इस व्यवहार को आश्चर्यजनक / अप्रत्याशित पाते हैं।
mtraceur

4

सामाजिक / सांस्कृतिक जड़ता।

यह सवाल कैसे-मनुष्यों-कार्य समस्या स्थान में है, इसलिए मैं उस कोण से उत्तर देने जा रहा हूं, बिना इस बारे में कोई राय दिए कि क्या सुविधा डिफ़ॉल्ट रूप से होनी चाहिए या नहीं ।

प्रारंभ करने के लिए सुनिश्चित करें कि आप दूसरे पक्ष को समझते हैं, विचार है कि झुंझलाहट आप सुविधा को बंद करने के लिए अपने रास्ते से हट जाने के लिए होने के बारे में लग रहा है, झुंझलाहट वे है बनाने के लिए होता लग रहा है अगर वे चालू करने के लिए अपने रास्ते से हट जाना पड़ा विशेषता।

उपरोक्त को इस तथ्य के साथ मिलाएं कि पर्याप्त bashउपयोगकर्ता इस सुविधा का उपयोग करते हैं, इसे हटाने या डिफ़ॉल्ट रूप से बंद करने के सुझाव उन लोगों से प्रतिरोध के साथ मिलते हैं जो पहले से ही वहां डिफ़ॉल्ट रूप से सहज हैं।

इसके अलावा, bashकई लोगों के लिए डिफ़ॉल्ट शेल है (न केवल डिफ़ॉल्ट लॉगिन या सिस्टम शेल अर्थ में, बल्कि मनोवैज्ञानिक अर्थ में)। यदि शेल उद्धृत करने के लिए आपका संदर्भ फ़्रेम है bash, यदि वह शेल आपने पहले सीखा है, तो यह तथ्य कि !एक विशेष शेल कैरेक्टर आपको स्वाभाविक और स्वचालित लगेगा (या कम से कम, जब आप पहली बार इसे सीखेंगे, तो यह सिर्फ एक हिस्सा होगा। जिस तरह से शेल है, कई में से स्वीकार करने के लिए सिर्फ एक क्वर्की)।

और अगर आप इसके बारे में सोचते हैं, तो बहुत से bashउपयोगकर्ता संभवतः सकारात्मक संदर्भ में इतिहास प्रतिस्थापन सिंटैक्स का सामना करते हैं : वे इसके बारे में पढ़ते हैं या कोई व्यक्ति उन्हें दिखाता है और वे इसकी संभावित उपयोगिता देखते हैं, जब वे पहली बार सीख रहे होते हैं bash

यह केवल अन्य बॉर्न जैसे गोले के परिधीय दुनिया से आ रहा है, जिसे आप !विशेष रूप से काट लेंगे और इस तरह इसे नकारात्मक रूप से देखने की इच्छा होगी: क्योंकि यदि आप उन गोले के लिए उपयोग किए जाते हैं जहां आपके पास कभी सुविधा नहीं थी, तो आपका पहला इसका जोखिम तब होगा जब यह आपको उस समय खराब कर देगा जब आप जल्दी में कुछ करने की कोशिश कर रहे हों।

TL; DR: अधिकांश उपयोगकर्ता संभवतः इस बात की दृढ़ता से परवाह नहीं करते हैं कि डिफ़ॉल्ट या तो तरीका है, कुछ उपयोगकर्ताओं को सुविधा पसंद है और इसका पहले से ही उस तरह से मजबूत लाभ है, और इस सुविधा के खिलाफ सक्रिय रूप से समर्थन करने के लिए पर्याप्त लोग नहीं हैं उस पर काबू पाएं।


2
नहीं, यह केवल अन्य गोले से आने पर नहीं है। मैं में वर्षों के लिए इस सुविधा से जानता हूं bashऔर अब भी, आश्चर्य ने काट लिया हो एकल के हवाले से के रूप में हमेशा काम नहीं करता पर !टूटे की वजह से bashकार्यान्वयन।
फिलिप्पुस

@Philippos यह भयानक है (ठीक है, बिल्कुल भयानक नहीं है ... लेकिन कुछ प्रकार के संकटात्मक संकट हैं)। इस पर ध्यान दिलाने के लिए धन्यवाद। एक बार मैंने इसे एकीकृत करने के लिए एक अच्छा तरीका सोचा है तो मैं इस उत्तर को फिर से अपने उत्तर में काम करने की कोशिश करूंगा।
mtraceur

2

बश इतिहास प्रतिस्थापन अभी भी डिफ़ॉल्ट रूप से सक्षम क्यों है?

क्योंकि बहुत से लोग इसका उपयोग करते हैं, और एक इंटरैक्टिव बैश शेल का उपयोग करने वाले लोगों को शायद समस्याओं से बचने के लिए नियमों को जानना चाहिए और आमतौर पर यह पता चलेगा कि यह दर्द से अधिक मदद करता है।

मेरे .bashrc ने कई वर्षों के लिए सेट + एच को शामिल किया है लेकिन कुछ अन्य लोग अभी भी इस सुविधा से काट रहे हैं।

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

यह देखते हुए कि हर कोई कॉपी-पेस्ट सुविधाओं के साथ टर्मिनलों का उपयोग कर रहा है

मेरी राय में एक clunkier विकल्प ...

वहाँ वास्तव में किसी भी कारण के लिए सुविधा है? सभी गोले के लिए डिफ़ॉल्ट रूप से अक्षम होने पर भी कोई मौजूदा स्क्रिप्ट नहीं तोड़ी जाएगी।

हां, लोगों को यह उपयोगी लगता है। एक रिमोट कंट्रोल होने में क्या फायदा है जो आप सिर्फ चैनल को बदलने और बदलने में सक्षम होने के लिए इस्तेमाल करते हैं?

(स्पष्ट रूप से सुविधा के प्रमुख मुद्दे हैं यदि यह सभी स्क्रिप्टिंग के लिए डिफ़ॉल्ट रूप से अक्षम है और निष्पादित करने से पहले परिणामों को सत्यापित करने के लिए एक सुविधा मौजूद है: shop -s histverify।)

इतिहास वास्तव में लिपियों में कोई मतलब नहीं रखता है, लेकिन इससे भी महत्वपूर्ण बात यह है कि यह सुरक्षा मुद्दों का कारण बन सकता है। अपने मामले में आप एकल उद्धरणों का उपयोग करके समस्या से बच सकते हैं। मुझे यह याद नहीं है कि यह मेरे लिए कभी कोई मुद्दा है, इसलिए मुझे नहीं पता कि आप यह कैसे कह सकते हैं कि इसमें 'प्रमुख मुद्दे' हैं। क्या यह आपके लिए एक वास्तविक समस्या है, या आप एक नए कंप्यूटर पर अपनी चूक सेट करने से नाराज थे?

यदि आप वास्तव में कुछ पैसा प्राप्त करना चाहते हैं, तो मैं यह नहीं देखता कि यह किसी एक उद्धरण से बचना या उसका उपयोग करना कैसे अलग है:

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it

2
संबंधित प्रश्न (दाएं कॉलम) देखें; अधिकांश प्रश्न इस सुविधा को दुर्घटना से मार रहे हैं और मान लेते हैं कि शेल टूट गया है। मैंने व्यक्तिगत रूप से इस सुविधा के बारे में एक लंबे समय से पहले इस तथ्य के कारण सीखा कि मैंने गलती से चरित्र अनुक्रम का उपयोग किया था जो गलत आउटपुट का कारण बना। मैं द्वारा बचा लिया गया था, shopt -s histverifyलेकिन यह डिफ़ॉल्ट रूप से नहीं था। इसके अलावा, अपने आप से कारण का पता लगाना बहुत कठिन है क्योंकि त्रुटि संदेश गूढ़ है ("ईवेंट नहीं मिला") और ट्रिगर करने वाला वर्ण अनुक्रम Google के लिए कठिन है।
मिको रानाल्टेनन

1
लोगों को वास्तव में इस सुविधा से काट लिया जाता है क्योंकि "सार्वभौमिक" शेल सिंटैक्स विशेषताएं जैसे $कि अंदर विशेष होना "..."पहली ऐसी चीजों में से एक है जो लोग शेल के बारे में सीखते हैं, जबकि यह तथ्य जो !अंदर विशेष है "..."(लेकिन केवल इंटरैक्टिव मोड में है) कम मोटे तौर पर जाना जाता है, आमतौर पर तुरंत / प्रमुख रूप से नहीं पढ़ाया जाता है, और यह बहुत bashउपयोगी है। इसके अलावा, बॉर्न जैसे गोले में ज्यादातर टेक्स्ट-इन-इन-स्क्रिप्ट और टेक्स्ट-ऑन-ए-इंटरएक्टिव-शेल के बीच एक समरूपता होती है, इसलिए आप आम तौर पर एक से दूसरे में नकल कर सकते हैं और यह एक ही काम कर सकता है - और यह सुविधा बनाता है केवल अपवादों में से एक।
mtraceur

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