शेल के इतिहास के माध्यम से खोज करने का सबसे अच्छा तरीका


78

क्या grep की तुलना में कमांड के लिए मेरी इतिहास फ़ाइल खोजने का एक बेहतर तरीका है? मुझे कुछ अंदाजा है कि कमांड के रूप में क्या शुरू होता है, लेकिन मुझे नहीं पता कि यह इतिहास में कितना पीछे है।

अद्यतन: पूर्व में zsh विशिष्ट था, लेकिन अतिव्यापी उत्तरों के कारण यहां किसी भी शेल (या मोड (vi / emacs)) के लिए जवाब देने के लिए स्वतंत्र महसूस हो रहा है, बस यह नोट करें कि क्या यह विशिष्ट है।

जवाबों:


73

Ctrl+ Rआमतौर पर सबसे अच्छा तरीका है, जैसा कि वर्णनकर्ता ने कहा । आप उपयोग भी कर सकते हैं !string, जो सबसे हालिया कमांड से शुरू होता है string, या !?string?, जो सबसे हालिया कमांड चलाता है string

(मुझे लगता है कि इस प्रश्न के लिए प्रासंगिक एकमात्र सामग्री है, लेकिन मैंने इस उत्तर में इतिहास के बहुत अधिक आदेशों को शामिल किया है )


4
आप 'ctrl + r' की तरह कैसे दिखते हैं?
xenoterracide


मुझे नहीं पता था कि एसई इंजन किसी भी html धन्यवाद को स्वीकार करता है।
xenoterracide

मुझे नहीं पता था कि kbd कीवर्ड "ctrl" और "+" की सही व्याख्या करेगा! मैं प्रत्येक कुंजी को अलग से टैग करता था। धन्यवाद!
ओलिवियर डुलैक

2
@OlivierDulac दुख की बात है कि यह नहीं है, यह है कि मैं कैसे कुंजी स्वरूपित करने के लिए इस्तेमाल किया; किसी को मेरा उत्तर संपादित बाद में उन्हें अलग कुंजी बनाने के लिए
माइकल Mrozek

30

बैश का उपयोग करते समय, टाइप करें Control- Rऔर फिर टाइप करना शुरू करें। टाइपिंग Control- Rबार - बार कुछ पाठ इनपुट करने के बाद आपको मेल खाने वाली कमांड लाइनों में वापस ले जाएगा।


18

यकीन नहीं है कि यह मदद करेगा, लेकिन मुझे उपयोग करना पसंद है ctrl- rऔर फिर कमांड टाइप करना शुरू करें। यह आपके इतिहास के माध्यम से जाना चाहिए और आपको पहले मैच के साथ प्रस्तुत करना चाहिए। मैचों के माध्यम से टॉगल करने के लिए ctrl- rफिर से मारा ।


2
क्षमा करें, चिड़ियाघर के बारे में भूल गया। आपको इस कीबाइंडिंग को अपने ~ / .zshrc: bindkey '^ R' के इतिहास-वृद्धिशील-खोज-पिछड़े
डिक्रिप्टर

17

यदि आप निम्नलिखित को जोड़ते हैं ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

और बैश को पुनरारंभ करें, आप टाइप करना शुरू कर सकते हैं, और फिर उपयोग कर सकते हैं Page Upऔर Page Downपिछड़े और आगे बढ़ने के लिए लाइनों के इतिहास के माध्यम से उसी उपसर्ग के साथ शुरू कर सकते हैं जो आपने अभी टाइप किया है।

(कुछ लोग उपयोग करना पसंद कर सकते हैं \e[Aऔर \e[B, जो सामान्य Upऔर Downक्रियाओं को बदलने के बजाय नई कुंजी बांधेंगे।)


मैं इन कमांड को मैप करना पसंद करता हूं Alt + Upऔर Alt + Down। कुंजीपटल अनुकरण के आधार पर टर्मिनल अनुकरण का उपयोग करता है इन संयोजनों के लिए या तो मैप किया जा सकता है \E[Aऔर \E[A(लिनक्स कुंजी बाइंडिंग के साथ जैसे केडीई कंसोल) या \E[1;3Aऔर \E[1;3B(जैसे XFCE टर्मिनल या एक्स नि: शुल्क 4 बाइंडिंग के साथ केडीई कंसोल)।
क्रिश्चियन हरजेन

9

द्वारा प्रेषित संवादात्मक संकेत Ctrl- R, जो पहले ही उल्लेख किया गया था, सबसे सुविधाजनक तरीका है। इसके अतिरिक्त यह कमांड लाइन पर वर्तमान में उपसर्ग के लिए इतिहास को खोजने के लिए रीमैप Upऔर Downएरो कुंजियों के लिए लोकप्रिय है , हालांकि इसके लिए ~/.inputrcफ़ाइल में कुछ बदलावों की आवश्यकता होती है ।

क्लासिक और कम इंटरेक्टिव समाधान शेल इतिहास विस्तार का उपयोग करना है। टाइपिंग

!foo

के साथ शुरू होने वाली अंतिम कमांड निष्पादित करेगा fooऔर

!?foo

इसमें शामिल अंतिम कमांड निष्पादित करेगा foo। इतिहास विस्तार के बारे में अधिक जानकारी बैश संदर्भ मैनुअल में पाई जा सकती है , यह मानते हुए कि आपका शेल बैश है या संगत है।


6

आप जोड़ देते हैं तो stty -ixonआपके लिए ~/.bashrcफ़ाइल तो Ctrl- sविपरीत दिशा में जाना होगा Ctrl- r


मैं C-sइस उद्देश्य के लिए उपयोग करना चाहता था , लेकिन मेरा टर्मिनल जम गया ; सावधान! (ठीक है, मैं अभी तक किसी भी कार्यरत हैं नहीं stty ixon, यकीन नहीं है कि इस के लिए है।)
इवान Zakharyaschev - IMZ

3
@imz: C-q" अनफ़्रीज़ " करेगा। यह C-sसामान्य सॉफ़्टवेयर प्रवाह नियंत्रण वर्ण हैं जो एक बार आउटपुट के प्रवाह को मैन्युअल रूप से बाधित करने के लिए उपयोगी थे (धीमी गति से सीरियल कनेक्शन का उपयोग किए जाने पर)। अब आउटपुट ज्यादातर मामलों में इतना तेज है कि जब आप प्रेस करना चाहते हैं तो C-sपहले ही स्क्रॉल कर चुके हैं। stty -ixonसॉफ्टवेयर प्रवाह नियंत्रण बंद कर देता है।
डेनिस विलियमसन

बहुत खुबस! मैंने इस तरह से इतिहास में आगे बढ़ने के लिए एक रास्ता खोजा है।
marlar

3

यदि आप टाइप करते हैं !lsतो बैश आपके इतिहास को देखेगा और सबसे हालिया कमांड को निष्पादित करेगा जो "ls" से शुरू होता है


2

zsh विशिष्ट हो सकता है। शोध में यह जवाब मैं पाया vi-history-search-backward जो एक साथ खोज करने के लिए अनुमति देता है /(जो मुझे लगता है मैं में था का उल्लेख नहीं था) vi मोड में आप तो उपयोग कर सकते हैं nऔर Nक्रमश: आगे और पीछे खोज करने के लिए (दबाने के बाद enter)।


2

मुझे आश्चर्य है कि इसका उल्लेख नहीं किया गया है - लेकिन आप ऐसा करके bash या ksh में vi-mode का चयन कर सकते हैं:

set -o vi

... या इस का उपयोग सामग्री के रूप में ~/.inputrc(GNU रीडलाइन जैसे प्रोग्राम में उपयोग के लिए किया जाता है):

set editing-mode vi

फिर उसके बाद, आप कमांड मोड मेंEsc प्रवेश करने और इतिहास में वापस जाने के लिए और आगे बढ़ने के लिए उपयोग कर सकते हैं। आप सामान्य रूप से खोज करने के लिए , और रिवर्स में खोज करने के लिए भी खोज कर सकते हैं ।kj/?

यदि आप उपयोग करते हैं ~/.inputrc, तो यह न केवल जीएनयू बैश में काम करेगा बल्कि ऐसी किसी भी चीज में जो जीएनयू रीडलाइन का उपयोग करता है जैसे कि सीएलआईएसपी और संभवतः प्रोग्राम जैसे कि MySQL कमांड शेल और सीपीएएन शेल की तरह।


2

रिवर्स सर्च (Ctrl-R कमांड के साथ) का उपयोग करते हुए आगे बढ़ने के लिए:

  1. अपनी .bashrc फ़ाइल को खोलें:
    sudo gedit ~/.bashrc

  2. इस लाइन को जोड़ें (अक्षर "f" को सिस्टम द्वारा अभी तक उपयोग नहीं किए गए अन्य के साथ बदला जा सकता है)

    bind '"\C-f": forward-search-history' 
  3. अपनी फ़ाइल बंद करें और अपने .bashrc (या किसी अन्य टर्मिनल को खोलें) को कमांड के साथ अपडेट करें:
    source ~/.bashrcया. ~/.bashrc

अब आप SHORTCUT के साथ इतिहास में आगे बढ़ सकते हैं: Ctrl + f

उबंटू 18.04 एलटीएस पर काम करना


1

मैं ज्यादातर समय दो का उपयोग करता हूं।
लेकिन कृपया ध्यान दें कि दोनों ने वर्णों को शुरू करने के लिए खोज की।

  1. tcsh : कमांड के कुछ कुछ चेंजर्स टाइप करें Esc+ फिर pयह पिछले कमांड को दिखाएगा जो कि की सीक्वेंस से शुरू होगा इसे फिर से दबाएं यह एक और कमांड को दिखाएगा।
  2. ksh : इसका उपयोग fc -e - <SPACE> <first few char for your previous >उस क्रम से मेल खाते हुए अंतिम कमांड चलाएगा।

मैं की तरह कुछ ढूँढने में सक्षम नहीं था Ctrl+ Rमेरी ksh और tcsh के लिए बैश में।


3
Ctrl + r बाश की तुलना में ksh में थोड़ा अलग तरीके से काम करता है। Ctrl + r दबाएँ और फिर वह स्ट्रिंग टाइप करें जिसे आप खोज रहे हैं और एंटर दबाएँ । उसी चीज़ को खोजने के लिए, Ctrl + r दबाएं और स्ट्रिंग को फिर से टाइप किए बिना दर्ज करें। यह set -o emacsमोड में है, वैसे।
डेनिस विलियमसन

@ डेनिस: +1 :-)
हेमंत

1

उपयोग करने का एक तरीका है Ctrl- tsh केR साथ । अपने में निम्नलिखित जोड़ें :~/.cshrc

bindkey "^r" i-search-back (यह सिर्फ एक कार्यवाहक संकेत है और पत्र आर)

यही मेरे लिए सबसे बड़ा समय बचाने वाला है।


1

@ephemient के समान उत्तर, लेकिन आप अपने .bashrc में डाल सकते हैं

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

और वाक्यांश का एक हिस्सा टाइप करें, और फिर सबसे हाल के विकल्पों को ब्राउज़ करने के लिए ऊपर / नीचे तीर का उपयोग करें। यह मैटलैब का डिफ़ॉल्ट व्यवहार है।

अधिकांश लोगों के लिए, यदि आप अपनी सेटिंग्स को एक नई प्रणाली में पोर्ट करना चाहते हैं, तो यह याद रखना आसान है ~/.bashrcकि आपके लिए बस इतना ही रोना है कि आपको यह सब करना है~/.inputrc


0

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


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