पहले से लिखी गई उपसर्ग के साथ पिछले कमांड को खोजें


66

हम कमांड इतिहास में नेविगेट करने के लिए ऊपर और नीचे तीर का उपयोग कर सकते हैं।

कुछ IDE में, जैसे कि Matlab, यदि हम कुछ इनपुट करते हैं और फिर तीर कुंजियों को दबाते हैं, तो हम केवल उन इतिहास कमांडों के बीच स्क्रॉल करते हैं, जिनके साथ हमारे पास इनपुट है। यह वास्तव में सुविधाजनक है, लेकिन शेल टर्मिनल में, यह काम नहीं करता है।

क्या शेल टर्मिनल में एक समान कार्य करने का कोई तरीका है? और टर्मिनल उपयोग में दक्षता में सुधार के लिए कोई अन्य सुझाव?


आप बस एक शेल का उपयोग कर सकते हैं जो इस तरह की सुविधा प्रदान करता है, जैसे fish;)
योना

@ आप बैश नहीं कर रहे हैं मान रहे हैं। यह रीडलाइन के माध्यम से, बस डिफ़ॉल्ट रूप से सुलभ नहीं है।
मुरु

@ एमआरयू मैं सीटीआरएल + आर के बारे में जानता हूं, और एंगमोंट का जवाब पेज अप / पेज डाउन के साथ इसे करने का एक अच्छा तरीका प्रदान करता है। क्या तीर कुंजी के साथ ऐसा करने का कोई तरीका है?
योना

1
@yoann unix.stackexchange.com/a/76591/70524 देखें । के बजाय \e[5~और \e[6~उपयोग करते हैं, , ।\e[A \e[B
मूरू

जवाबों:


94

तुम जो खोज रहे हो, वह है CtrlR

टाइप करें CtrlRऔर फिर कमांड का हिस्सा जिसे आप चाहते हैं। बैश पहला मिलान आदेश प्रदर्शित करेगा। टाइप करते रहें CtrlRऔर बैश पिछले मिलान आदेशों के माध्यम से चक्र करेंगे।

इतिहास में पीछे की ओर खोजने के लिए, CtrlSइसके बजाय टाइप करें । (यदि CtrlSआप उस तरह से काम नहीं करते हैं, तो इसका मतलब है कि आपको XON / XOFF प्रवाह नियंत्रण को अक्षम करने की आवश्यकता है: ऐसा करने के लिए, चलाएं stty -ixon।)

यह "खोज" के अंतर्गत प्रलेखित है man bash


1
Ctrl-Qजमे हुए राज्य को छोड़ने के लिए, यदि आप पहले से ही Ctrl-Sप्रवाह नियंत्रण को बंद किए बिना हिट करते हैं और अपने टर्मिनल को जमे हुए मिला है।
हांगबोझू

26

इन्हें अपने यहां रखें ~/.inputrc:

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

ये अपनी इच्छानुसार बनाते Page Upऔर Page Downव्यवहार करते हैं। (कुछ वितरणों ने इसे आपके लिए पहले ही कॉन्फ़िगर कर दिया है।) मैं व्यक्तिगत रूप से इन तरीकों को Ctrl+ Rया से अधिक सुविधाजनक पाता हूं history


यह सभी वर्तमान उत्तरों में सबसे सुविधाजनक तरीका है। क्या आप कार्य प्रणाली पर थोड़ी व्याख्या कर सकते हैं?
ली

3
~/.inputrcया /etc/inputrcया पर्यावरण चर द्वारा संदर्भित फ़ाइल $INPUTRCbash (आपके शेल) सहित रीडलाइन का उपयोग करके सभी एप्लिकेशन की लाइन संपादन कॉन्फ़िगरेशन फ़ाइल है। इसमें कुछ अंतर्निहित इन-एडिटिंग क्षमताएं हैं, जिनमें इन दोनों को शामिल किया गया है: अधिक जानने के लिए इन कीवर्ड्स में से किसी एक के लिए bash के मैनुअल पेज सर्च करें। \e[5~/ \e[6~अधिकांश टर्मिनल एमुलेटर में पेज अप / डाउन कीज़ द्वारा उत्पन्न एस्केप सीक्वेंस हैं; इसे देखने के लिए, catकमांड को लॉन्च करें और फिर इन कुंजियों को दबाएं (बच बाइट को टर्मिनल ^[में दर्शाया गया है, जैसे इनपुटबैंक में \e)।
एग्मोंट

आपके मूल प्रश्न में उदाहरण कहता है कि अप / डाउन कीज़ Matlab में इस तरह से काम करती हैं। यह देखना दिलचस्प होगा कि क्या हुआ अगर आपने इनपुट आर्क में अप और डाउन के अनुक्रम को रखा और इस कार्रवाई को सौंपा; क्या यह सही ढंग से काम करेगा, या इसके साइड इफेक्ट्स के साथ संघर्ष के रूप में बुरा साइड इफेक्ट है। यदि आप इसके साथ प्रयोग करते हैं, तो मुझे आपके निष्कर्षों को सुनकर खुशी होगी।
इग्मोंट

जब मैं करता हूं तो echo $INPUTRCवह खाली होता है। मैं Ubuntu 14.04
JorgeeFG

2
मैं व्यक्तिगत रूप से ऐसा करने के लिए ऊपर और नीचे तीर को ओवरराइड करना पसंद करता हूं: "\e[A": history-search-backwardऔर"\e[B": history-search-forward
ए। वन

9

इसके अलावा ^ r / ^ का इतिहास i-search:

alt.कर्सर पर पिछले कमांड के अंतिम "शब्द" को सम्मिलित करता है। पुराने कमांड से अंतिम शब्द प्राप्त करने के लिए इसे दोहराएं। (लेकिन ध्यान दें कि एक अनुगामी &पृष्ठभूमि आदेशों के लिए अंतिम शब्द के रूप में गिना जाता है)।

इस के लिए सुपर आसान है mkdir foo, cdआल्ट-डॉट। अप-एरो से भी तेज, ^ a, alt-d (डिलीट फॉरवर्ड वर्ड) cd,।

2-से-अंतिम शब्द प्राप्त करने के लिए, उपयोग करें esc - 2 alt+.(यानी एक emacs- शैली संख्यात्मक तर्क का उपयोग करें alt+.। अंत से नकारात्मक मायने रखता है, शुरू से ही सकारात्मक मायने रखता है।) लेकिन यह आमतौर पर इसके लायक होने की तुलना में अधिक परेशानी है; कुछ बिंदु पर यह माउस और कॉपी / पेस्ट, या अप-एरो और ^ w / ^ y भाग में पहुँच जाता है (नीचे देखें)।


यदि आपके टर्मिनल को अच्छी तरह से / ठीक से सेट किया गया है, तो ctrl-left और ctrl-right शब्दों द्वारा पीछे / आगे जाएगा। यदि नहीं, तो उम्मीद है कि कम से कम alt-b और alt-f एक ही काम करेंगे।


ctrl- / एक पूर्ववत है। यदि आप थोड़ा सा ओवरशूट करते हैं तो आप शब्दों को हटाने के लिए ऑटो-रिपीट का उपयोग अधिक कुशलता से कर सकते हैं।


आदेशों का अधिक शक्तिशाली मिश्रण / मिलान किल-रिंग के उपयोग से आता है, जो Emacs की तरह ही काम करता है। ctrl-y अंतिम ctrl-w / ctrl-u / ctrl-backspace / alt-d पेस्ट करने के लिए। alt-y पुराने मारे गए पाठ के माध्यम से चक्र करने के लिए।

एकाधिक ctrl-w या पंक्ति में जो कुछ भी मार-रिंग प्रविष्टि पर बनाते हैं। यदि आप दो चीजों को हटाना चाहते हैं और केवल एक बाद में पेस्ट करना चाहते हैं तो प्रवेश को तोड़ने के लिए बाएं और दाएं तीर का उपयोग करें।

इन सभी को एक साथ मिलाकर आप कर सकते हैं

  • एक कमांड टाइप करना शुरू करें
  • ctrl-r एक पुरानी कमांड पर वापस जाने के लिए और नियंत्रण-डब्ल्यू या समान के साथ इसका हिस्सा हड़पने के लिए।
  • esc-r या alt+rइसे पुनर्स्थापित करने के लिए कि इससे पहले कि आप इसे का हिस्सा हटा दें।
  • alt- >इतिहास के अंत तक जाने के लिए (यानी नीचे-तीर सभी तरह से), उस कमांड को वापस पाने के लिए जिसके बीच में आप थे।

अन्य इंटरैक्टिव-उपयोग युक्तियां:

सक्षम करें shopt -s globstar, ताकि आप कर सकें **/*.c(वर्तमान डायर सहित पुनरावर्ती)। कभी-कभी इंटरैक्टिव उपयोग के लिए आसान है, लेकिन आमतौर find -name '*.c' -exec foo {} +पर बेहतर है।

यदि आप बैश स्क्रिप्ट लिखते हैं, तो आपको shopt -s extglobअपने इंटरैक्टिव गोले में भी सक्षम होना आसान होगा । आप कभी-कभी*.!(c|h) .c या .h के साथ समाप्त नहीं होने वाली फ़ाइलों से मेल खाने वाले सामान के लिए एक उपयोग पाएंगे ।

आप के लिए चाहते उपनाम का पता लगाएं ls -l, less, और कुछ और आप बहुत कुछ कर। ( cp -i, mv -i, और rm -Iअच्छा कर रहे हैं। की आदत मत आधार पर उन पर एक चयनात्मक rm क्या करना है। जीएनयू rm की मैं सभी आर्ग के लिए एक बार पूछता है।)

मुझे पसंद है alias m=less("अधिक" के लिए एम)। मैंने पिछली / अगली फ़ाइल ( ) के lessसाथ सेट अप ,और .बाध्य किया है lesskey। डिफ़ॉल्ट एक बहु-कुंजी अनुक्रम है जिसे ऑटोरपेट के साथ उपयोग नहीं किया जा सकता है।


मुझे GNU स्क्रीन के अंदर सब कुछ करना पसंद है। मुझे कोनसोल (या किसी अन्य टर्मिनल एमुलेटर ने कोशिश नहीं की है) में नावों की तुलना में गिने स्क्रीन-खिड़कियों का ट्रैक रखना आसान लगता है। यदि आप पहले से नहीं जानते हैं screen, तो tmux सीखें क्योंकि यह नया और कम crufty है।

एक अन्य शेल के रूप में एक ही cwd के साथ एक नया शेल खोलने की कार्यक्षमता की तरह कुछ पाने के लिए, मैं cd / pushd / popd के लिए एक कस्टम हुक काcds 8 उपयोग करता हूं जो मुझे cd को स्क्रीन विंडो 8 में मेरे शेल को जो भी उपयोग कर रहा है करने की अनुमति देता है। यह स्क्रीन सत्र के बाहर भी शेल के लिए काम करता है, जब तक कि केवल एक स्क्रीन सत्र हो।


मेरा प्रतीत नहीं होता है "ठीक से कॉन्फ़िगर किया गया"। मेरे द्वारा यहां देखे गए बहुत सारे शॉर्टकट काम नहीं करते हैं, मैं Ubuntu 14.04 से स्टॉक टर्मिनल का उपयोग कर रहा हूं। मैं इसे कैसे कॉन्फ़िगर कर सकता हूं?
जॉर्जीफेग

@ जोर्जफ: मुझे लगता है कि यह मेरे लिए gnome-terminalउबंटू 14.04 के साथ बॉक्स से बाहर काम कर रहा था, इससे पहले कि मैंने केडीई पर स्विच किया। प्रासंगिक विकल्प आपके टर्मिनल सेटिंग्स में है, एस्क-प्रीफिक्स बनाम उच्च-बिट, और शायद कुछ अन्य सेटिंग्स। उनमें से कुछ ssh के माध्यम से मेरे लिए पूरी तरह से काम नहीं करते हैं। (जैसे ctrl बायां / दायाँ तीर कुंजी के लिए भागने का कोड मुंज करता है, और मुझे 5Dशाब्दिक रूप से दिखाई देता है)
पीटर कॉर्ड्स

7

निम्नलिखित लाइनों को अपने में जोड़ें ~/.inputrc

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

यह एग्मोंट के जवाब के समान है, लेकिन पेज अप और पेज डाउन का उपयोग करने के बजाय, यह एरो अप और एरो डाउन के लिए एस्केप सीक्वेंस का उपयोग करता है। मैक पर उपयोग करने के लिए यह तरीका बहुत अधिक सुविधाजनक है।


4

मैं हमेशा अपनी मशीनों को एक बड़े HISTSIZE मान के साथ कॉन्फ़िगर करता हूं ताकि यह एक लंबी इतिहास सूची के साथ-साथ समय टिकट मूल्य के साथ HISTTIMEFORMAT रखता है ताकि मैं देख सकूं कि कमांड कब चला था।

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "

3

मेरे द्वारा आमतौर पर उपयोग किए जाने वाले साधन के historyसाथ कमांड को संयोजित करना हैgrep

अर्थात:

history | grep <command im looking for>

आपके द्वारा लिखी गई कमांड्स का एक संख्याबद्ध इतिहास प्रदर्शित करेगा, जिसमें वह कमांड है, जिसे आप तब उपयोग कर सकते हैं:

!<number listed in history command>

उस आदेश को फिर से करना।

अर्थात:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

के बाद: !571

दोहराना होगा history | grep history


1
CR = बहुत बेहतर + बहुत सुरक्षित
PSkocik

1
शायद, व्यक्तिगत रूप से मुझे लगता है कि ज्यादातर कमांड को खोजने का एक तेज़ साधन होने के लिए एक इतिहास है। जहां तक ​​सुरक्षित है, मुझे यकीन नहीं है कि आपका क्या मतलब है, इतिहास का उपयोग करने में निहित जोखिम क्या हैं क्योंकि इसे आरआर के साथ खोजा गया है?
ग्रेवी

2
@ ग्रेवी मुझे संदेह है कि PSkocik का मतलब है कि !इतिहास प्रतिस्थापन कम सुरक्षित है।
derobert

3
@ ग्रेवी अंतर्निहित जोखिमों को गलती से गलत लाइन मिल जाएगी। पता नहीं कि आपका टर्मिनल क्यों जम गया है, जब तक कि आपने कंट्रोल-एस का उपयोग नहीं किया है और आपके पास एक्सन / एक्सऑफ़ फ्लो कंट्रोल सक्षम है (अक्सर डिफ़ॉल्ट)। यदि हां, तो नियंत्रण-क्यू इसे वापस लाएगा।
derobert

1
मैं @PSkocik से सहमत हूं, cr बहुत बेहतर है क्योंकि इतिहास लाइन को संपादित करना आसान है, बजाय इसके कि इसे फिर से उसी तरह से चलाएं। सटीक-समान आदेश को फिर से चलाना एक जटिल मामला है जो आप जटिल वन-लाइनर्स पर समय-री-टाइपिंग भिन्नताओं को बचाने के लिए कर सकते हैं, या लंबे रास्ते में एक अलग फ़ाइल को टैब-पूरा कर सकते हैं। मेरा जवाब देखिए।
पीटर कॉर्ड्स

1

मैंने अपने बैश टर्मिनल में दैनिक 4 युक्तियों (और कुछ अन्य) का उपयोग किया:

  • अंतिम आदेश निष्पादित करें: !!

  • इतिहास से निष्पादित आदेश N : !N

  • इतिहास से उपसर्ग के साथ शुरू होने वाली अंतिम कमांड प्रिंट करें : !prefix:p

  • इतिहास से उपसर्ग के साथ शुरू होने वाली अंतिम कमान : !prefix


1

यदि आप के zshबजाय यह उपयोग करने के लिए ठीक है, तो आप कोना इसके bashलिए ओह-माय-ज़श का उपयोग करते हैं।

इसमें आपके कमांड इतिहास के माध्यम से नीचे नेविगेशन का तीर है। यह भी, उसी नेविगेशन की अनुमति देता है जब आप पहले से ही पाठ टाइप कर चुके होते हैं (जैसे मैथलैब)।

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

https://github.com/robbyrussell/oh-my-zsh


1
oh-my-zshसामान का टन होता है। आप यह भी कह सकते हैं: यह सटीक विशेषता उस डिस्ट्रो में शामिल है, जब आपको एक विशिष्ट सेटिंग या ऐप की आवश्यकता होती है।
मुरु

मैंने पोस्ट को संपादित किया: मैंने चेतावनी दी कि यह एक साधारण ऐप से बड़ा है।
user9869932

1

निम्नलिखित उपनाम को ~ / .bashrc में जोड़ें

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

उपयोग: h fireमुझे आदेशों की एक सूची मिलेगी जिसमें आग शामिल है । या h ^fireमुझे आग से शुरू होने वाले आदेशों की एक सूची मिलेगी ।

यह उपयोगी है जब मैं एक ही समय में आदेशों की एक श्रृंखला देखना चाहता हूं।

वैसे, '"'"'बदसूरत है, लेकिन मैं एकल उद्धरणों में एकल उद्धरण से बचने के अन्य तरीके नहीं खोज सका।


फी - h="history | awk '{\$1=\"\"; print}'काम करना चाहिए। वैकल्पिक रूप से एक फ़ंक्शन बनाएं और कॉल करें।
डार्कहार्ट

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