कमांड-हिस्ट्री में पूर्ववत परिवर्तन कैसे करें?


12

UNIX सिस्टम में आप पिछले कमांड के माध्यम से नेविगेट करने के लिए ऊपर और नीचे तीर दबा सकते हैं। यह बेहद आसान है।

कभी-कभी, मैं ऊपर जाता हूं और एक आदेश पाता हूं जिसे मैं फिर से उपयोग करना चाहता हूं, लेकिन कुछ बदलावों के साथ। अगर मैं इस तरह के बदलाव करता हूं, तो मेरे पास मूल कमांड वापस लाने का कोई तरीका नहीं है, जब तक कि मैं इसमें जांच नहीं करता history

क्या कुंजियों के माध्यम से एक्सेस किए गए इतिहास में कमांड के परिवर्तनों को "पूर्ववत" करने का कोई तरीका है?

मेरा वर्तमान वर्कअन #कमांड को प्रस्तुत करने के लिए है। इस तरह से वर्तमान कमांड एक टिप्पणी के रूप में किया जाता है, इसलिए कुछ भी नहीं होता है। फिर, मैं कुंजी के साथ कमांड के माध्यम से फिर से ब्राउज़ कर सकता हूं। समस्या यह है कि मैं जिस कमांड का उपयोग कर रहा था, वह सूची में बहुत दूर हो सकता है, इसलिए दो सौ बार फिर से जाना थोड़ा सा है। नियंत्रण + आर या तो एक समाधान नहीं है, क्योंकि मुझे ठीक से याद नहीं है कि मैं क्या देख रहा था।

उदाहरण

मैंने निम्नलिखित "50 कमांड पहले" टाइप किया:

ls -l /etc/httpd/conf/

अब मैं उस लाइन तक गया और उसे बदल दिया

ls -l /etc/init.d/

लेकिन प्रवेश नहीं दबाया। अब, मैं ls -l /etc/httpd/conf/फिर से प्राप्त करना चाहता हूं ।

मेरा वातावरण

$ echo $SHELL
/bin/bash
$ echo $TERM
xterm

कमांड हिस्ट्री बदली हुई है, संभवतः आपके द्वारा उपयोग किए जा रहे शेल की (गलत-) विशेषता है। में ksh, उदाहरण के लिए, आप इतिहास प्रविष्टियों को संपादित और प्रवेश की "पिछले संस्करण" हटाए बिना उन्हें आह्वान कर सकते हैं; आपके पास सभी चालान आदेश उपलब्ध हैं।
जैनिस

"यह बदल जाता है" से मेरा मतलब है कि: एक पिछली कमांड दी जिसे मैंने तीर के साथ पहुंचने के बाद बदल दिया, अगर मैं तीर के साथ ऊपर और नीचे जाता हूं, तो पुरानी कमांड उस तरह से नहीं दिखाएगी, लेकिन जिस तरह से मैंने संशोधित किया यह। बेशक, अगर मैं कमांड दर्ज करते हुए "एंटर" टाइप करता हूं, तो वह पुरानी कमांड होगी जैसा कि शुरू में था; लेकिन यह ठीक वही है जो मैं बचने की कोशिश कर रहा हूं और इसके शुरुआती मूल्य को कमांड "रीसेट" करने का एक तरीका ढूंढ रहा हूं।
फेडोरक्वि

1
इस मामले में भी, kshव्यवहार यहाँ भिन्न होता है, ऐसा लगता है। और आपका इतिहास संपादित विकल्प भी चुना हुआ संपादन मोड पर निर्भर करता है। में kshकी vi मोड, उदाहरण के लिए, पुराने प्रविष्टि ओवरराइट नहीं है, और मैं भी में की तरह एक पूर्ववत् आदेश जारी कर सकते हैं, viके साथ, 'यू'।
जैनिस

उह, यह बहुत ही आशाजनक लगता है। मैं अब बैश में काम कर रहा हूं और वर्तमान में बदलने के लिए विचार नहीं कर रहा हूं ksh, लेकिन यह जानना अच्छा है कि ऐसी चीज वहां मौजूद है।
फेडोरक्वि

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

जवाबों:


10

जब तक आपने एक इतिहास प्रविष्टि को संपादित किया है Enter, लेकिन अभी तक दबाया नहीं गया है, मूल प्रविष्टि पर वापस जाने के लिए, बार-बार Ctrl+ _- undoकमांड दबाएं - जब तक कि यह आगे कोई बदलाव नहीं करता। आप मूल प्रविष्टि पर वापस आ गए हैं।


5

मूल कमांड पर वापस लौटें जब आपने लाइन में कई बदलाव किए हैं:

revert-line (M-r) 
    Undo all changes made to this line. This is like 
executing the undo command enough times to get back to the beginning.

Mमेटा कुंजी है, जो altrमेरे लिए है।


आभार, फिर भी उपयोगी जानकारी

जब आप है ओ पी की तरह एक आदेश पहले किया था (ऐसा होता है) को मार डाला, वहाँ "पूर्ववत करें" क्योंकि आदेशों नियंत्रित किया जाता है और द्वारा याद करने के लिए कुछ भी नहीं है जीएनयू ReadLine पुस्तकालय और कर रहे हैं करने के लिए नहीं लिखा$HISTFILE खोल बाहर निकलता है जब तक। मेरे द्वारा इसका उल्लेख करने का कारण यह है क्योंकि आप सिर्फ grepउसी $HISTFILEतरह की उम्मीद नहीं कर सकते हैं और यह शेल से बाहर निकलने के लिए आदर्श नहीं हो सकता है।

तो यहाँ सभी विकल्प हैं जो आपको पिछले सभी रीडलाइन कमांड के माध्यम से वापस स्क्रॉल करने से बचाते हैं।

यदि आपको कुछ कमांड याद हैं , तो ctrl+ दबाएं rऔर उस स्ट्रिंग वाले पिछले कमांड के माध्यम से सर्च करने के लिए जो कुछ भी याद है उसे टाइप करेंctrl+ rफिर से दबाने पर अगला सबसे हालिया प्रदर्शन होगा, जो पीछे की ओर खोज रहा है।

उदाहरण के लिए, ls -lतब ctrl+ rजितनी बार आप चाहते हैं, पिछली कमांड को खोजने के लिए टाइप करें। यदि आप इसे अतीत में स्क्रॉल करते हैं, तो ctrl+ sवर्तमान स्थिति से आगे खोज करेगा।

fcबैश आदेश builtin पिछले ReadLine आदेशों के साथ सूचकांक संख्याओं को सूचीबद्ध करना उपयोगी है।

fc -l -100 पिछले 100 कमांड को रीडलाइन में सूचीबद्ध करेगा।

इसके अतिरिक्त, अगर ओपी जानता है कि वह पिछले ls -lकमांड की तलाश में है , तो वह आउटपुट को grepइस तरह से पाइप कर सकता है :fc -l -100 | grep 'ls -l'

यह ls -lएक इंडेक्स नंबर से पहले के पिछले कमांड की सूची को आउटपुट करना चाहिए । आउटपुट इस तरह दिखता है:
2065 ls -l

अब आप ईवेंट डिज़ाइनर का उपयोग कर सकते हैं !nजहां nइंडेक्स नंबर है। इस उदाहरण में, निष्पादन !2065का विस्तार होगा ls -l


हालांकि यह इस तथ्य के बाद मदद नहीं करता है, किसी को भी देख जब पिछले आदेशों को संशोधित देखना चाहिए हाल के आदेश इतिहास को संरक्षित करने HISTORY EXPANSIONकी धारा man bash। इतिहास को अधिलेखित किए बिना पुरानी आज्ञाओं को संशोधित करने के लिए यहां कुछ वैकल्पिक विधियां दी गई हैं।

Event Designatorsअनुभाग से पता चलता है कि कैसे आप कर सकते हैं आसानी से हाल ही में उपयोग आदेश से संपादित स्ट्रिंग।

^string1^string2^
              Quick  substitution.  Repeat the previous command, replacing string1 with string2.  Equivalent to
              ``!!:s/string1/string2/'' (see Modifiers below).

उदाहरण:

$ echo foo
foo 
$ ^foo^bar
echo bar
bar

अब सबसे हालिया कमांड दिखाएंगे:

echo foo
echo bar

उपरोक्त उदाहरण यह भी बताता है कि sedकिसी ईवेंट डिज़ाइनर में स्ट्रिंग को बदलने के लिए कैसे उपयोग किया जाए।

!-n    Refer to the current command minus n.

तो अगर इतिहास में 3 आदेश है echo fooतो आप उपयोग करेंगे:
!-3:s/foo/bar

ध्यान दें कि ईवेंट डिज़ाइनर आपके इतिहास में इस मामले में निष्पादित कमांड के रूप में दिखाई देंगे echo bar। यह इतिहास में दिखाई नहीं देगा !-3:s/foo/bar

बस इसे बाहर फेंकने के रूप में यह निकट से संबंधित लगता है, भले ही यह "पूर्ववत" समाधान की तुलना में "न करें" से अधिक है, जिसे ओपी की तलाश है।


यह अच्छा है, विस्तृत जानकारी के लिए बहुत धन्यवाद। मैं गाइल्स के जवाब को स्वीकार कर रहा हूं क्योंकि यह वही है जो मैं देख रहा हूं, जबकि यहां आप मानते हैं कि मैं उस कमांड के बारे में कई चीजें जानता हूं जो मैं फिर से करना चाहता हूं, जो कि हमेशा ऐसा नहीं होता है।
महासंघ

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