संक्षिप्त उत्तर: बैश का बिलियन fc
(फिक्स कमांड)
fc
इतिहास के आदेशों को संपादित करने और फिर से निष्पादित करने के लिए बने बैश शेल में अंतर्निहित कमांड है ।
यह साइगविन पर भी मौजूद है और यह उन सभी लिनक्स वितरणों पर काम करता है जिन पर मैंने परीक्षण किया है:
fc -s '\'='/' -1
कुछ स्पष्टीकरण
कुछ शब्द इस बारे में अधिक क्यों आपको "प्रतिस्थापन विफल" हो रहे हैं
ऐसा लगता है कि s
संशोधक के लिए (अभी तक) बैकस्लैश चरित्र के प्रतिस्थापन को लागू नहीं किया गया है \
, जो कि पलायन एक है। यह सुनिश्चित करने के लिए हमें कोड को देखना चाहिए, उदाहरण के लिए, बैश इतिहास विस्तार के गन्नू संस्करण का (लेकिन उपरोक्त कमांड प्राप्त करने के लिए कि आप क्या करने की कोशिश कर रहे थे ... तो मैं इसे आलसी लेता हूं ....)।
कुछ नोट:
हम यह सोचकर आगे बढ़ रहे हैं कि यह प्रत्येक RegEx के साथ काम करेगा जिसे हम काम कर रहे हैं sed
, लेकिन इसकी गारंटी नहीं है। बैकस्लैश विस्तार का पलायन चरित्र है और समस्या यहाँ है। इसके अलावा विस्तार का व्यवहार shopt
विकल्पों के साथ संबंधित है , इसलिए हमें मामले को मामले से देखना शुरू करना चाहिए ...
जब आप cd C:\Foo\Bar
अपने बैश शेल में स्ट्रिंग चिपकाते हैं, तो इसका विस्तार किया जाएगा और यह दुभाषिया के लिए दिखाई देगा cd C:FooBar
; इस रूप में यह $_
आंतरिक चर में भी संग्रहीत किया जाएगा ।
यदि आप के बजाय चिपकाया cd "C:\Foo\Bar"
या cd 'C:\Foo\Bar'
में $_
चर आप खोजना चाहिए C:\Foo\Bar
।
चूँकि एक पूरी लाइन पढ़ने के तुरंत बाद इतिहास का विस्तार किया जाता है, इससे पहले कि शेल इसे शब्दों में तोड़ दे, आपको कुछ बशीवाद के साथ इसका उपयोग शुरू करने के लिए लुभाया जा सकता है , कम या ज्यादा सादे, उदाहरण के लिए, कुछ व्युत्पत्ति के साथ (शायद जोड़कर :p
या :q
) ""
, पार्सिंग वगैरह ...)
!!:0 ${_//\\/\/}
यह याद रखने का क्षण है कि पथ और फ़ाइल नाम के साथ खेलना शुरू करना सुरक्षित नहीं है , खासकर यदि वे विंडोज़ क्लिपबोर्ड से आते हैं (सामान्य रूप से पृष्ठ क्योंls
पढ़ा है ? पार्स नहीं ?) , यह अनिवार्य रूप से टैब का उपयोग करने की संभावना से संबंधित है, रिक्त स्थान और newlines फ़ाइल नाम और निर्देशिका वाले के लिए सही वर्ण ...)।
इसके अलावा जब आप माउस से कैप्चर किए गए टेक्स्ट को पेस्ट करते हैं , तो आप एक अग्रणी स्थान भी पेस्ट कर सकते हैं। इससे बच सकते हैं कि आपका कमांड इतिहास में समाप्त हो जाएगा (यह शेल विकल्पों में से निर्भर करता है ...)। यदि ऐसा है तो आपका अनुसरण !!
नियंत्रित नहीं होगा ... ( किसी अन्य उत्तर में एक उदाहरण देखें )।यह एक अनावश्यक मूर्त जोखिम है ।
निष्कर्ष
इतिहास विस्तार इतिहास सूची के शब्दों को इनपुट स्ट्रीम में पेश करता है, जिससे कमांड्स को दोहराना आसान हो जाता है, पिछले इनपुट में आर्ग्युमेंट्स को मौजूदा इनपुट लाइन में डालें या पिछली कमांड्स में त्रुटियों को जल्दी से ठीक करें।
अगर यह आसान नहीं है तो मुझे लगता है कि हम कुछ गलत कर रहे हैं ;-)
Ad nauseam: थोड़ा सा प्रयोग
मैंने histverify
शेल में सक्षम किया है ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
फिर मैं प्रेस करता हूं Enterऔर सत्यापित विस्तार के रूप में
echo D:\Foo\Bar {1,2}A
फिर मैं Enterफिर से दबाता हूं और यह गूँजता है
D:FooBar 1A 2A
यह इंगित करता है कि ब्रेस विस्तारsubstitution failed
से पहले संसाधित इतिहास विस्तार में उत्पन्न होता है , इसलिए सबसे पहले , और यह पुष्टि करता है कि इतिहास संशोधक ने चरित्र के प्रतिस्थापन को वास्तविक रीगेक्स के रूप में संसाधित नहीं किया (अभी तक) । ..s
\
cd 'C:\foo\bar'