पिछली कमांड प्राप्त करने के लिए बैश इतिहास का उपयोग करते हुए, इसे कॉपी करें और फिर इसे 'रन' करें लेकिन कमांड के साथ टिप्पणी की


79

मेरे bashकौशल को बेहतर बनाने के लिए बस एक सवाल । मैं हमेशा ऐसा करता हूं:

$ history | grep some_long_command

...
...
123 some_long_command1.........
124 some_long_command2.........
...

मैं तब कमांड को चला सकता हूं जो मैंने कर पाया था:

!123

हालांकि, मैं अक्सर ऐसा करना चाहता हूं:

some_long_command1foobar

यानी इसे चलाने से पहले मैं कमांड बदल दूं। क्या आप इस आदेश को चलाने के लिए bash का उपयोग कर सकते हैं:

#some_long_command1

तो यह टिप्पणी की जाती है।

फिर मुझे कमांड को हाइलाइट करने, संपादित करने और फिर उसे चलाने के लिए अपने माउस का उपयोग करने की आवश्यकता नहीं है (मैं बस कीबोर्ड का उपयोग कर सकता हूं - तेज)।

मुझे लगता है कि मैं इसे करने के लिए एक स्क्रिप्ट लिख सकता था, लेकिन पहले से ही कहीं पर कार्यक्षमता का निर्माण हो सकता है ....?


6
सबसे आसान तरीका: bind Space:magic-spaceअपनी बैश प्रोफाइल में डालें । फिर, दबाने Spaceका विस्तार होगा !123में some_long_command1
ब्लेज़

@ पौष्टिक: धन्यवाद! वह एक मेरे लिए नया था। बहुत उपयोगी।
10

जवाबों:


140

मैं इतिहास कमांड का उपयोग करने के बजाय सुझाव देता हूं, आप उपयोग करें ctrl+r और उस कमांड को लिखना शुरू करें। जब आप एक तीर कुंजी दबाते हैं जैसे कि इसे संशोधित करने के लिए जाना जाता है, तो यह स्वत: पूर्ण मान्यता से बाहर हो जाएगा, और चलने से पहले आपको संपादित करने देगा।

अद्यतन: यदि आप अलग-अलग कमांड के माध्यम से साइकिल चलाना चाहते हैं, जिसमें आपके द्वारा टाइप किए गए स्ट्रिंग हैं, तो दबाए रखें ctrl+r


8
यदि आप vi कीबाइंडिंग ( set -o vi) का उपयोग करते हैं , तो आप /इतिहास को खोजने और उसे संपादित करने के लिए भी उपयोग कर सकते हैं ।
विलियम पर्सल

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

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

1
यह दुखद है कि अप / डाउन मैचों के माध्यम से स्क्रॉल नहीं करता है लेकिन खोज से तुरंत बाहर निकल जाता है। मैंने इसे अप / डाउन के साथ मैचों के माध्यम से स्क्रॉल करने के लिए पसंद किया होगा (यह दर्शाता है कि मैं अभी भी उस कमांड की तलाश कर रहा हूं जो मैं चाहता हूं), और खोज से केवल बाएं / दाएं बाहर निकलें (यह दर्शाता है कि मुझे वह कमांड मिला है जो मैं चाहता हूं। और अब मैं इसे संपादित करने के लिए तैयार हूं)।
ADTC

3
@ADTC मुझे अभी वही करने का एक तरीका मिला है जो आप (और मैं) चाहते हैं: प्रेस करना ctr+r, टाइप करना शुरू करें, फिर जब आप उन सभी कमांड को ढूंढना चाहते हैं जिनमें यह शामिल है, तो बस दबाए रखें ctrl+r। दूसरे शब्दों में, आप अप / डाउन के साथ क्या करना चाहते हैं (राउंड रॉबिन फैशन में)ctrl+r
मिकेल

61

वास्तव में, आप केवल :pइसे वास्तव में चलाने के बिना इसे प्रिंट करने के लिए कमांड में जोड़ सकते हैं । उदाहरण के लिए:

$ ls -la
$ !!:p

ls -laइसे चलाने के बिना पिछले आदेश के रूप में प्रिंट करेगा , और आप बस दबा सकते हैं इसे खोजने और इसे संपादित करने के लिए (ऊपर) हैं।

आप भी कर सकते हैं

!123:p

अपने पिछले आदेश के रूप में 123 वाँ कमांड प्रिंट करने के लिए।


2
+1 सबसे अच्छा जवाब, क्योंकि यह सामान्य इतिहास कमांड को ओपी का जवाब देने की अनुमति देता है !mycmd:p:। यदि आपके पास बैश में vi कमांड चालू हैं, तो Pursell का उत्तर केवल अच्छा या बेहतर है। Ctrl-r, जैसा कि मिकेल द्वारा बताया गया है, सबसे अच्छा है।
ब्रेंट फौस्ट

नहीं में 123 तो लाइन आप कर सकते हैं की शुरुआत: 123: p!?
उदी

19

आप fcइतिहास में कमांड को संपादित करने के लिए कमांड का भी प्रयास कर सकते हैं ।

WIKI कहता है,

एफसी कि सूचियों या संपादन और reexecutes, आदेश पहले से एक इंटरैक्टिव खोल करने के लिए प्रवेश किया यूनिक्स पर एक मानक कार्यक्रम है। fc बैश शेल में एक अंतर्निहित कमांड है ; मदद fc उपयोग जानकारी दिखाएगा।


इसके अलावा रिवर्स वृद्धिशील खोज ( Ctrl+ R), हम कुछ और है बैश शॉर्टकट:

से man bash:

पिछला इतिहास (Cp)
    इतिहास सूची से पिछली कमांड प्राप्त करें, सूची में वापस जा रहा है। 
अगला इतिहास (Cn)
    इतिहास सूची से अगला कमांड प्राप्त करें, सूची में आगे बढ़ रहा है। 
इतिहास की शुरुआत (M- <)
    इतिहास में पहली पंक्ति में जाएं। 
इतिहास का अंत (M->)
    इनपुट इतिहास के अंत में जाएं, अर्थात, वर्तमान में दर्ज की जा रही लाइन। 
रिवर्स-सर्च-हिस्ट्री (Cr)
    वर्तमान लाइन पर पीछे की ओर खोजें और आवश्यकतानुसार इतिहास के माध्यम से 'ऊपर' जाएं। यह एक वृद्धिशील खोज है।
आगे-खोज-इतिहास (Cs)
    वर्तमान लाइन पर शुरू करें और इतिहास को आवश्यक रूप से आगे बढ़ाएं। यह एक वृद्धिशील खोज है।
गैर-वृद्धिशील-रिवर्स-खोज-इतिहास (Mp)
    उपयोगकर्ता द्वारा आपूर्ति की गई स्ट्रिंग के लिए गैर-वृद्धिशील खोज का उपयोग करके वर्तमान लाइन पर शुरू होने वाले इतिहास के माध्यम से पीछे की ओर खोजें। 
गैर-वृद्धिशील-आगे-खोज-इतिहास (Mn)
    उपयोगकर्ता द्वारा आपूर्ति की गई स्ट्रिंग के लिए गैर-वृद्धिशील खोज का उपयोग करके इतिहास के माध्यम से आगे खोजें।
yank-nth-arg (MCy)
    पहले तर्क को पिछले कमांड (आमतौर पर पिछली लाइन पर दूसरा शब्द) में डालें। एक तर्क n के साथ, पिछले कमांड से nth शब्द डालें (पिछले कमांड में शब्द 0 शब्द से शुरू होता है)। एक नकारात्मक तर्क एनटी शब्द को पिछले कमांड के अंत से सम्मिलित करता है। एक बार तर्क n की गणना की जाती है, तो तर्क निकाला जाता है जैसे कि "n" इतिहास विस्तार निर्दिष्ट किया गया था।
yank-last-arg (M-।, M-_)
    पिछले तर्क को पिछले कमांड (पिछले इतिहास प्रविष्टि का अंतिम शब्द) में डालें। एक तर्क के साथ, बिल्कुल yank-nth-arg की तरह व्यवहार करें। यैंक-लास्ट-अरग के लिए लगातार कॉल इतिहास सूची के माध्यम से वापस जाते हैं, प्रत्येक पंक्ति के अंतिम तर्क को बदले में डालते हैं। इतिहास विस्तार सुविधाओं का उपयोग अंतिम तर्क निकालने के लिए किया जाता है, जैसे कि "$!" इतिहास विस्तार निर्दिष्ट किया गया था।
शेल-विस्तार-लाइन (MCe)
    शेल के रूप में लाइन का विस्तार करें। यह उपनाम और इतिहास विस्तार के साथ-साथ शेल शब्द के सभी विस्तार करता है। इतिहास विस्तार के विवरण के लिए नीचे दिए गए विवरण देखें।
इतिहास-विस्तार-पंक्ति (M- ^)
    वर्तमान लाइन पर इतिहास का विस्तार करें। इतिहास विस्तार के विवरण के लिए नीचे दिए गए विवरण देखें।
सम्मिलित-अंतिम-तर्क (M-।, M-_)
    यंक-अंतिम-अर्ग का पर्यायवाची। 
संचालित-और-प्राप्त-अगला (सह)
    निष्पादन के लिए वर्तमान लाइन को स्वीकार करें और संपादन के लिए इतिहास से वर्तमान लाइन के सापेक्ष अगली पंक्ति प्राप्त करें। किसी भी तर्क की अनदेखी की जाती है।
संपादन-और-निष्पादित-कमांड (C-xC-e)
    वर्तमान कमांड लाइन पर एक संपादक को आमंत्रित करें, और शेल कमांड के रूप में परिणाम निष्पादित करें।


6

आप M- ^ (एक मैक पर विकल्प-शिफ्ट -6) मारकर मोड को संपादित करने के लिए प्राप्त कर सकते हैं।

इसे टाइप करें:

- 123M- ^

और आप कमांड # 123 का संपादन करेंगे। यह ctrl-r का उपयोग करने की तरह है, लेकिन विस्मयादिबोधक-बिंदु सिंटैक्स के साथ शुरू होता है।


M-^कुछ और उंगली के अनुकूल फिर से बाँधा जा सकता है?
ब्लेज़

4

historyकमांड का उपयोग करने के बजाय , कुंजी history-search-backward/ history-search-forwardशॉर्टकट को बाँध / जो आसानी से याद किया जा सकता है (मुझे PgUp / PgDown पसंद है)। ऐसा करने के लिए, इसे अपनी .inputrcफ़ाइल में डालें :

"<key code>":  history-search-backward
"<key code>":  history-search-forward

प्राप्त करने के लिए <key code>, Ctrl-V <key>शेल में टाइप करें , और शुरू के ^[साथ बदलें\e जो कुछ भी आउटपुट था, उसमें ।

यह सेट होने के बाद, आप someप्राप्त करने के लिए बस PgUp टाइप और दबा सकते हैं some_long_command। यदि आपको आवश्यकता है, some_long_command with_some_argलेकिन some_long_command with_some_other_argइतिहास में बाद में एक समान कमांड है , तो आप तब तक साइकिल चला सकते हैं जब तक आप इसे टाइप करके नहीं पहुंचते हैं someऔर फिर PgUp को बार-बार मारते हैं, या आप टाइप कर सकते हैं some, PgUp को हिट कर सकते हैं , कर्सर को उस स्थान पर ले जा सकते हैं जहां दोनों कमांड अलग-अलग होने लगते हैं, कुछ अक्षर टाइप करें और एक बार फिर PgUp को हिट करें। समान आदेशों के बीच शीघ्रता से / अंतर करने की यह क्षमता मेरे विचार से इसे और अधिक आरामदायक उपकरण बनाती है Ctrl-R


3

आप भी डाल सकते हैं

shopt -s histverify

आपके पास .bash_profile, जो किसी भी इतिहास के विस्तार को आपकी कमांड लाइन पर चलने के बिना दिखाई देता है, ऐसा करने से पहले आपको संपादित करने की अनुमति देता है।


1

आप "सुझाव बॉक्स" जैसे इतिहास https://github.com/dvorka/hstr की कोशिश करना चाहते हैं - यह बैश इतिहास पढ़ता है और त्वरित नेविगेशन के लिए अनुमति देता है।

एचएच

अंतिम कमांड को बस एचएच टाइप करने के लिए, कमांड पर नेविगेट करें और इसे कमांड लाइन पर (जहां आप इसे संपादित कर सकते हैं और / या टिप्पणी जोड़ सकते हैं) प्राप्त करने के लिए दायाँ तीर का उपयोग करें।


0

^ यूनिक्स / सोलारिस में अंतिम टाइप कमांड प्राप्त करने के लिए पी


0

डाल

उर्फ आर = 'एफसी-एस'

.bashrc( अपने घर में) तो आप बस में टाइप कर सकते हैं

r <whatever>

कमांड प्रॉम्प्ट पर और आप अंतिम <whatever>कमांड (उसी परम) की एक प्रति निष्पादित करेंगे जो आपके इतिहास में है। अगर आपको जरूरत महसूस होती है, तो यह देखने के लिए कि आपने क्या निष्पादित किया है, बस तीर को मारो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.