मैं बैश इतिहास और फिर से कमांड को कैसे खोज सकता हूं?


जवाबों:


428

टाइप Ctrl Rआदेश पंक्ति पर और पिछला आदेश लिखना प्रारंभ करें। एक बार परिणाम दिखाई Ctrl Rदेने के बाद अन्य मैच देखने के लिए रुकें। जब आप जो आदेश चाहते हैं वह प्रकट होता है, बस दबाएँEnter

ध्यान दें कि Ctrl Rडिफ़ॉल्ट होने पर, यदि आप चाहते थे कि कमांड ( reverse-search-history) आपके लिए बाध्य हो Ctrl Tतो निम्नलिखित के साथ कॉन्फ़िगर कर सकते हैं:

बाइंड "" \ "सीटी: रिवर्स-सर्च-हिस्ट्री '

अन्य रीडलाइन बाइंडेबल कमांड्स की एक पूरी मेजबानी है जो आपके लिए भी उपलब्ध हैं। bashमैन पेज पर एक नजर डालें ।

बैश के पास इंटरेक्टिव कमांड हिस्ट्री को खोजने और एक्सेस करने के लिए कई सुविधाएं हैं। जिनमें से सबसे बुनियादी historyबिलिन है। टाइपिंग बस:

$ इतिहास

न्यूमेरिक इंडेक्स के साथ कमांड्स की एक सूची प्रिंट करेंगे, जैसे:

$ इतिहास
1 स्पष्ट
2 एलएस -लाल
3 vim ~ / somefile.txt
4 इतिहास
$

फिर आप इनमें से किसी भी कमांड को उनके संख्यात्मक सूचकांक का उपयोग करके इंडेक्स को एकल के साथ जोड़कर निष्पादित कर सकते हैं !, जैसा कि मिच ने बताया:

$ 1

clearआज्ञा का पालन करेंगे । इतिहास निर्मित में कई विशेषताएं हैं, आप अधिक bashऔर historyमैन पेजों में देख सकते हैं ।

आप !डिज़ाइनर का उपयोग करते समय सापेक्ष नकारात्मक ऑफसेट भी निर्दिष्ट कर सकते हैं , इसलिए ऊपर हमारी इतिहास सूची का उपयोग करते हुए, यदि हम vimफिर से निष्पादित करना चाहते हैं, तो हम कर सकते हैं:

$ -2

जो मूल रूप से आपको "दो कमांड्स" चलाए गए कमांड को निष्पादित करने के लिए बैश बता रहा है। इतिहास सूची में पिछली कमांड को चलाने के लिए, हम बस उपयोग कर सकते हैं !!(जो कि केवल शॉर्टहैंड है !-1)।

!डेसिग्नेटर आप संख्यानुसार निर्दिष्ट करना जो चलाने के लिए आदेश को सीमित नहीं करता। hayalci से पता चला कि आप bashकमांड का उपयोग ( !या) के साथ शुरू होने वाले पाठ के आधार पर कर सकते हैं !?। फिर, ऊपर हमारी उदाहरण इतिहास सूची का उपयोग करते हुए, यदि हम clearफिर से निष्पादित करना चाहते हैं, तो हमें बस इतना करना है:

$! cl

और दबाएँ Enter। और किस बारे में vim? यह उतना ही सरल है:

$! कुछ

हैलसी की प्रतिक्रिया से सबसे महत्वपूर्ण बिंदु बिलिन के लिए कॉल है shopt:

$ दुकान -s हिस्टिविरीज़

ताकि यह इतिहास सत्यापन सक्षम हो जाएगा आदेशों से मिलान किया जाता है !, !!और !?designators आँख बंद करके मार डाला नहीं कर रहे हैं, लेकिन इसके बजाय कमांड लाइन पर भरे गए हैं ताकि आप सुनिश्चित कर सकते हैं कि वे उन्हें क्रियान्वित करने से पहले कोई बुराई करेंगे। यह तब और भी महत्वपूर्ण है जब आप कमांड को रूट उपयोगकर्ता के रूप में निष्पादित कर रहे हैं। यह विकल्प आपकी .bashrcस्टार्टअप फ़ाइल में सेट किया जा सकता है ताकि जब भी आप लॉग इन करें तो यह सेट हो जाए।

जैसा कि पहले ही बताया जा चुका है, इस सभी सूचनाओं को bashमैन पेज से चमकाया जा सकता है । के लिए?, !!, और!? रचनाकार, खंड 9.3 इतिहास विस्तार पर एक नज़र डालें ।


39
+1 मैं सभी प्रणालियों के लिए 12 वर्षों से लिनक्स का उपयोग कर रहा हूं। मुझे नहीं पता था कि अस्तित्व में है। काश मैं +10 होता तो मैं इसे कैसे याद करता ??
एडेन बेल

1
कई प्रणालियों पर, ऊपर-तीर को दबाने से ऐसा ही होता है।
मास

यदि कोई ',', '!!', '?', ',' इतिहास को समेकित करता grep ', और' ctrl-r 'एक व्यापक उत्तर में, मैं इसे
चुनूंगा

shoptbashrc में जाता है, bash_profile नहीं (या यह गोले के लिए सक्षम नहीं होगा जो लॉगिन गोले नहीं हैं)।
तोबू

2
CTRL + R दबाने के बाद भी आप CTRL + SHIFT + R का इस्तेमाल कई बार पिछली कमांड पर वापस जाने के लिए कर सकते हैं
Gal Bracha

37

एक विकल्प के रूप में crtl+R, आप टाइप करके इतिहास खोज सकते हैं

!text

यह हाल ही में आदेश के लिए इतिहास खोज करेंगे शुरुआत 'पाठ' के साथ।

लेकिन मेरा सुझाव है कि आप गलत कमांड के निष्पादन को रोकने के लिए इसे अपने .bashrc में डालें।

shopt -s histverify

यह इस तरह के बैश का निर्देश देता है, जैसे किसी भी इतिहास कार्रवाई (जैसे !!:s/prev_text/after_text) के बाद, यह परिणामी लाइन को कमांड प्रॉम्प्ट पर रखता है। फिर आप कमांड की समीक्षा या संपादन कर सकते हैं, और बाद में एंटर दबा सकते हैं।


5
का उपयोग करें? पाठ सबसे हाल ही में युक्त कमांड को फिर से निष्पादित करने के लिए (जैसा कि शुरुआत में) "पाठ" के साथ विरोध किया गया।
निशान 4o

3
यदि कोई ',', '!!', '?', ',' इतिहास को समेकित करता grep ', और' ctrl-r 'एक व्यापक उत्तर में, मैं इसे चुनूँगा।
रिचर्ड हॉकिंस

32

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

history | grep "stuff"

यह कुछ इस तरह लौटेगा

num stuff

फिर आप टाइप कर सकते हैं

!num

15

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

मेरे सिस्टम पर डिफ़ॉल्ट रूप से, Mp और Mn समान कार्य करते हैं, लेकिन मैं तीर कुंजी को बांधना पसंद करता हूं:

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

13

मेरे पास वास्तव में एक महान उपनाम है, ज। यह वास्तव में सिर्फ "इतिहास | grep" है, लेकिन मैं "grep -E -vv" के साथ पिछली "h कमांड" प्रविष्टियों को फ़िल्टर करता हूं।

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

की तरह इस्तेमाल किया

h aliases
2003  less .bash_aliases

1
यह भी कमांड जोड़कर पूरा किया जा सकता है HISTIGNORE
ताने

12

बेहतरीन राइटअप, सीन! मैं यह एक टिप्पणी में डाल दिया था, लेकिन मैं कुछ प्रतिष्ठा अंक शर्मिंदा हूँ। :-)

एक अन्य संबंधित और उपयोगी तकनीक एक शब्द को बदलते हुए पिछली कमांड को चलाने की क्षमता है। आप निर्देशिका नाम टाइप करते हैं, या फ़ाइल नाम बदलना चाहते हैं:

$ गूंज मेरा नाम बॉब है
मेरा नाम बॉब है
$ ^ बॉब ^ जोर्डन
echo मेरा नाम जोर्डन है
मेरा नाम जोर्डन है

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


6

Ctrl-r का उपयोग करके इतिहास के माध्यम से नेविगेशन के रूप में IMO बोझिल है, आप hh पर विचार करना चाह सकते हैं :

https://github.com/dvorka/hstr

जो नेविगेशन को बहुत सरल, सीधा और कुशल बनाता है - जिसमें कमांड चलाना शामिल है:

यहां छवि विवरण दर्ज करें


इसे कैसे उपयोग करे? इस तस्वीर को देखने के लिए किन कुंजियों को दबाएं?
नकीलोन

2
एक बार जब आप hh स्थापित करते हैं तो आप या तो hh कमांड का उपयोग कर सकते हैं या इसे किसी भी कीबोर्ड शॉर्टकट (आमतौर पर Ctrl-r) के साथ बाँध सकते हैं जैसा कि प्रलेखन में वर्णित है।
मार्टिन ड्वोरक

यह ctrl + rअब डिफ़ॉल्ट रूप से बांधता है
एलेलो

4

Bash कमांड प्रॉम्प्ट पर, control-R टाइप करें, फिर कमांड के कुछ अक्षर टाइप करें जो आप चाहते हैं और bash की रीडलाइन सुविधा कमांड कमांड के माध्यम से उस कमांड के लिए खोज करेगी।

आपके द्वारा खोज शुरू करने के बाद, आप अगले मिलान आदेश पर वापस जाने के लिए नियंत्रण-आर टाइप कर सकते हैं।


3

यदि आपके पास viकुंजी बाइंडिंग ( set -o viया होने set editing-mode viमें $HOME/.inputrc) का उपयोग करने के लिए आपका शेल कॉन्फ़िगर किया गया है , तो आप कमांड लाइन के इतिहास के माध्यम से साइकिल चलाने के लिए <Esc>/some-command<Return>हिट n(अगला) या Shift-n(पिछला) के साथ खोजें।


यह उपयोगकर्ताओं के सबसे करीब है।
गैबर मार्टन

2

CTRL+ Rसिर्फ ठीक काम करता है, जैसे @ John1024 ने सुझाव दिया है, लेकिन कुछ हद तक थकाऊ है अगर आपके कई हालिया कमांड समान हैं और आप उन सभी को स्कैन करने के लिए एक त्वरित तरीका चाहते हैं। उपयोग करने के लिए एक विकल्प होगा history:

$ history | grep keyword

0

मुझे HSTR पसंद है लेकिन मैं कभी-कभी इसे स्थापित करने में सक्षम नहीं हो सकता। इसलिए मैंने fzf का उपयोग करते हुए एक उपनाम लिखा जो उसके व्यवहार की नकल करता है ( hx, "इतिहास के निष्पादन के लिए")

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : अच्छा, इतिहास मिलता है
  • sed : सूची से नंबर कॉलम निकालें (POSIX)
  • fzf: यहाँ जादू है, आप फजी खोज-सूची को अंतःक्रियात्मक रूप से खोज सकते हैं, या इसके साथ आगे बढ़ सकते हैं, C-Jऔर C-Kफिर एक कमांड निष्पादित कर सकते हैं Enter
  • --height : दिखाई गई लाइनों की संख्या निर्धारित करें।
  • --tac : वापस सूची (एक इतिहास के लिए अधिक तार्किक)
  • --tiebreak=index : जब fzf परिणामों को अद्यतन करता है तो इतिहास क्रम रखें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.