जब मैं कुछ जाँचता हूँ तो एक आधा टाइप किया हुआ कमांड याद रखें


97

मैं अक्सर खुद को निम्न स्थिति में पाता हूं: मैंने बैश प्रॉम्प्ट पर एक लंबी कमांड टाइप करना शुरू कर दिया है, लेकिन आधे रास्ते से मुझे पता चलता है कि मुझे किसी अन्य कमांड के साथ कुछ जांचना होगा। यह एक समस्या है जब मैं कंसोल (कोई एक्स) पर होता हूं, जो अक्सर होता है, क्योंकि तब मेरे पास इसे करने के लिए असंतोषजनक तरीके हैं, जिन्हें मैं जानता हूं:

  • हिट ctrl+ alt+ F2और एक और वर्चुअल कंसोल पर लॉग इन करें, और पता करें कि मैं क्या चाहता था, फिर वापस जाएं और जारी रखें
  • ctrl+ a, प्रकार गूंज + space+ enter, बाहर मैं चाहता था प्रेस मिल जाए, जब तक मैं अपने आदेश मिल जाए, ctrl+ a, delx 5, ctrl+ e, और जारी रखने के लिए
  • हाइलाइट करें कि मैंने अपने माउस के साथ अब तक क्या टाइप किया है (यदि जीपीएम चल रहा है, जो कि यह आमतौर पर है), दबाएं ctrl+ cको बाधित करने के लिए, यह पता करें कि मैं क्या चाहता था जबकि सावधान रहें कि मेरे माउस का उपयोग सामान को उजागर करने के लिए न करें, फिर मध्य माउस बटन दबाएं एक नए संकेत पर और जारी रखें
  • कमांड लाइन के देवताओं से प्रार्थना करें कि आधे लिखे हुए आदेश का कोई प्रतिकूल प्रभाव नहीं पड़ेगा, लेकिन बस असफल हो जाएं, और जिंजरली प्रेस दर्ज करें, फिर पता करें कि मुझे क्या चाहिए, जब तक मैं अपना आदेश वापस नहीं ले लेता, तब तक ऊपर को दबाता हूं और जारी रखता हूं
  • अपने समय मशीन में कूद, समय में वापस यात्रा और अपने आप को याद दिलाना, आदेश लिखें वर्तमान, प्रेस करने के लिए वापस यात्रा शुरू करने से पहले स्क्रीन शुरू करने के लिए ctrl+ a c, मैं चाहता था पता लगाने के, प्रेस ctrl+ a ctrl+a, और जारी रखने के लिए

तो जो मैं जानना चाहता हूं, क्या ऐसा करने का कुछ और सुरुचिपूर्ण तरीका है? एक प्रकार की उप-कमान या समान?

मैं उन तरीकों में सबसे अधिक दिलचस्पी रखता हूं, जिन्हें काम करने के लिए किसी भी तैयारी या सेटअप की आवश्यकता नहीं होती है।

जवाबों:


68

एलेक्स के Ctrl + A Ctrl+ का कुछ हद तक तेज़ संस्करण K(जो लाइन के सामने की ओर जाता है और फिर सब कुछ काट देता है) बस Ctrl+ का उपयोग करना है U, जो बैश पर पीछे की ओर कटौती करता है, और पूरी लाइन (आपकी वर्तमान स्थिति की परवाह किए बिना) zsh पर। फिर आप इसे फिर से पेस्ट करने के लिए Ctrl+ Yका उपयोग करें


1
इसका परीक्षण करते हुए, मैं यह निष्कर्ष निकालता हूं कि Ctrl + U पीछे नहीं हटता है और आगे नहीं कटता है, बल्कि पीछे की ओर कट जाता है। कमांड के बीच में कर्सर होने से कमांड लाइन पर इसके पीछे जो कुछ भी है वह निकल जाता है। फिर भी @ एलेक्स के समाधान पर 33% सुधार हुआ, क्योंकि यह एक कीस्ट्रोक को बचाता है।
लॉरिट्ज वी। थुलो

2
@ लाज़ीर ओह, काफी सही; इस पर zshपूरी लाइन काट दी जाती है, लेकिन इस पर bashपीछे की तरफ कट लगता है। मैंने देखा है कभी नहीं है कि अंतर से पहले
माइकल Mrozek

2
ओह, मुझे नहीं पता था कि Ctrl + U बफर को मारने के लिए टेक्स्ट भी डालता है। जानकर अच्छा लगा! :)
एलेक्स

1
^U ^Kके रूप में एक ही प्रभाव होगा, ^A ^Kलेकिन थोड़ा अधिक ergonomic है, और काफी अधिक सुविधाजनक के तहत screen
intuited

53

लाइन शुरू करने के लिए ctrl-A करें, हैश प्रिपेंड करें और वापसी करें - इस तरह यह कमांड हिस्ट्री में एक कमेंट के रूप में रहेगा और आप इसे कर्सर के साथ वापस पा सकते हैं

संपादित करें: बस देखा कि यह आपके # 2 पर थोड़ा अधिक सुरुचिपूर्ण संस्करण है;)


1
हां, और मैंने ऐसा क्यों नहीं सोचा? धन्यवाद!
लॉरिट्ज वी। थुलो

1
मुझे अपना उत्तर पोस्ट करने से पहले पढ़ना होगा। जेम्स के पास यह अधिकार है।
सीन सी।

4
ध्यान दें कि यह काम नहीं करेगा cshया zshक्योंकि वे इंटरैक्टिव शेल में टिप्पणियों की अनुमति नहीं देते हैं। में zshआप उचित विकल्प को सक्रिय करने की जरूरत है: setopt interactive_comments
सैम होसेवर

1
@ सॅम हां, लेकिन ": कमांड" का एक ही प्रभाव है (":" = अशक्त कमांड)
बैरीक्रार्टर

6
@barrycarter: नहीं, :इस उद्देश्य के लिए हानिकारक माना जाना चाहिए और कभी भी, कभी भी सुझाव नहीं दिया जाना चाहिए। यह सभी संबंधित दुष्प्रभावों के साथ एक अर्धविराम के बाद, बैकटिक्स के अंदर सब कुछ निष्पादित करेगा।
सम होसेवर

29

मारो Ctrl+A, Ctrl+Kलाइन की शुरुआत में जाने के लिए और इसे खत्म करने के लिए (मार) को हटा दें। फिर अपना शोध करें, और जब Ctrl+Yअपने सहेजे (मारे गए) लाइन को वापस रखने के लिए हिट (यंक) जारी रखने के लिए तैयार हों।


3
आह, अब यह मेरे मन में जैसा था वैसा ही है। और मैं Emacs में हर समय वही करता हूं, जो कमांड लाइन पर समान करने के बारे में सोचना चाहिए था।
लॉरिट्ज वी। थुलो

13

Zsh में, मैं Ctrl+ Zको "सस्पेंड" करने के लिए टाइप करता हूँ, जो कमांड मैं टाइप कर रहा हूँ और दूसरी कमांड टाइप करता हूँ। मेरे द्वारा उस कमांड को चलाने के बाद (या इसे Ctrl+ के साथ निरस्त कर दिया गया C), निलंबित कमांड संस्करण के लिए वापस आती है (यहां तक ​​कि कर्सर की स्थिति को याद करते हुए)। अतिरिक्त सुविधा के रूप में, यदि कमांड लाइन खाली है जब मैं टाइप करता हूं Ctrl+ Z, तो कुंजी bgबिल्ट-इन के बजाय चालान करता है (इसलिए एक डबल Ctrl+ Zसीधे पृष्ठभूमि पर एक रनिंग कमांड भेजता है)।

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

मैं नहीं जानता कि कैसे कुछ इसी तरह की मार है।

किसी भी शेल में, आप वर्तमान लाइन की शुरुआत में जोड़ने# की कम-तकनीकी पद्धति का उपयोग कर सकते हैं ।


2
आपका कार्य सराहनीय है, लेकिन क्या आप जानते हैं कि zshइसमें पहले से निर्मित एक कार्य है ? यह कहा जाता है push-lineऔर आपको bindkeyइसे प्राप्त करने के लिए उपयोग करने की आवश्यकता है।
कालेब

@ कालेब: मुझे नहीं पता कि मैं यहाँ के push-inputबजाय क्यों उपयोग करता हूँ push-line, push-lineयह अधिक उचित लगता है (शायद पुराने संस्करण केवल zsh के पास थे push-input?)। लेकिन यह बाकी फ़ंक्शन के लिए एक प्रतिस्थापन नहीं है।
गाइल्स

जहां तक ​​मैं केवल अंतर बता सकता हूं कि एक रनिंग जॉब को बैकग्राउंड करने के लिए समान-बाध्यकारी प्रभाव है। क्या मैं कुछ भूल रहा हूँ?
कालेब

1
@Caleb: नहीं, यह सिर्फ इतना है कि मैं के संयोजन को खोजने के है दो दोनों सुविधाजनक ( push-lineहोने, एक खाली लाइन पर बेकार है bgपर Ctrl+Zही उपयोगी है जब मैं सिर्फ साथ है कि इस प्रक्रिया को निलंबित कर दिया Ctrl+Zऔर स्मरक (मैं या तो प्रक्रिया backgrounding कर रहा हूँ) या आंशिक कमांड लाइन)।
गाइल्स

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

13

बैश में, बस टाइप Alt+ करें #

फिर जब आप तैयार हों, Upतब Alt+ दबाएँ #

पहले #इसे टिप्पणी में बदलने के लिए लाइन के शुरू में डालता है , फिर लाइन को स्वीकार करता है, जैसे कि आपने दबाया था Enter

फिर, जब आप इसे दूसरी बार करते हैं, तो यह देखता है कि लाइन में पहले से ही एक #शुरुआत है, इसलिए यह इसे हटा देता है, और इसे स्वीकार करता है, फिर से आपको Enterकुंजी को बचाता है ।

यदि दूसरी बार सिर्फ एक और सम्मिलित करता है #, तो आपको इसके बजाय Alt+ - Alt+ टाइप #करना होगा।

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

bindkey -M emacs '\e#' pound-insert

अपने ~ / .zshrc में।

या, यदि आप vi बाइंडिंग का उपयोग कर रहे हैं, तो आप #bash और zsh दोनों में कमांड मोड से टाइप कर सकते हैं ।


2
मेरे लिए काम नहीं करता है, दूसरी कमांड का मतलब है कि # सामने वाले को अधिक # जोड़ना है।
लॉरिट्ज वी। थुलो

1
पहला काम करता है? आप किस संस्करण का उपयोग कर रहे हैं?
मिकेल

3
Alt + # काम करता है जैसा कि आप अपने तीसरे पैराग्राफ में वर्णन करते हैं, लेकिन आपके चौथे में नहीं है, यह बस एक और # सामने प्रस्तुत करता है और लाइन को स्वीकार करता है। मैं Ubuntu 10.10 पर बैश 4.1.5 (1) -release का उपयोग करता हूं।
लॉरिट्ज वी। थुलो

1
ओह प्रिये, बाश में इसके लिए एक संख्यात्मक तर्क की आवश्यकता होती है, जैसे Esc+1तब Alt+ #टॉगल करने के लिए।
मिकेल

यह काम करता है, लेकिन सिर्फ Ctrl + A Del Ctrl + E की तुलना में बहुत अधिक बोझिल है, विशेष रूप से मेरे कीबोर्ड लेआउट पर जहां Alt + # वास्तव में Alt + Shift + 3 है।
लॉरिट्ज वी। थुलो

10

मेरी पसंदीदा विशेषताओं में zshसे एक बिलिन पुश-लाइन फ़ंक्शन है जो यहां अन्य उत्तरों में किसी भी हैकरी के बिना इसका ध्यान रखता है। मैं यह करने के लिए बाध्य है Ctrl+ lमेरे में .zshrcइस तरह फ़ाइल:

bindkey '^L' push-line

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

आप इसकी कई परतों को भी चेन कर सकते हैं और कमांड्स उल्टे क्रम में आपके पास वापस आएँगे जो आपने उन्हें कतार में धकेला था।


5
डिफ़ॉल्ट रूप से Ctrl+Qऔर ESC q(emacs मोड में) बाध्य है ।
गाइल्स

क्या बैश के लिए भी कुछ ऐसा ही है?
मैग्नस

@ मैग्नस: कृपया इस प्रश्न के बाकी उत्तरों की समीक्षा करें। बैश के समाधान हैं, बस इस रूप में सुरुचिपूर्ण नहीं हैं।
कालेब

@ कालेब, मुझे और अधिक विशिष्ट होना चाहिए था, क्या बैश के लिए एक समान एकल संयोजन है?
मैग्नस

1
यह स्पष्ट रूप से "सही" जवाब है, वैसे भी Zsh के लिए! मैं केवल push-line-or-editविजेट का उल्लेख करना चाहता हूं , जो डिफ़ॉल्ट रूप से किसी भी कीमैप में बाध्य नहीं है। शीर्ष स्तर के संकेत पर यह वैसा ही काम करता है push-line, बल्कि किसी भी त्वरित स्तर पर यह पूरी कमांड को मल्टी-लाइन बफर में दर्ज किया जा सकता है। एक कीबाइंडिंग पर दो महान कार्य! मैं push-line-or-editसादे के बजाय बंधन की सिफारिश कर सकता हूं push-line। आप कुछ भी नहीं खोते हैं, और उपयोगी कार्यक्षमता प्राप्त करते हैं।
wjv

5

ctrl- a ctrl- kचाल के अलावा , यदि आप स्क्रीन में हैं, तो बस ctrl- a dअलग करने के लिए फिर से रीटेट करेंscreen -r

आप सिर्फ ctrl+ के साथ एक और विंडो भी खोल सकते हैंa c


8
यदि आप स्क्रीन में हैं, तो बस एक और विंडो खोलें Ctrl+A c
गाइल्स

1
@ गिल्स .. जब तक आपको शेल राज्य के कुछ पहलू (चर, फ़ंक्शन, उपनाम, आदि) का उपयोग करने की आवश्यकता नहीं है।
intuited

4

एक वैकल्पिक तरीका, हालांकि सही नहीं है, दबाएं Ctrl-X Ctrl-E। यह आपके आधे टाइप कमांड के साथ आपका डिफ़ॉल्ट संपादक खोल देगा। तब आप अपनी कमांड को एक फ़ाइल में सहेज सकते हैं या अपने संपादक के भीतर से एक नया शेल खोल सकते हैं। जब आप नए शेल से बाहर निकलते हैं, तो यह आपको संपादक को लौटा देगा और सामग्री को सहेजना स्वचालित रूप से उन्हें निष्पादित करेगा।

यह सही नहीं है क्योंकि यह आपको आपके मूल शेल में वापस नहीं करता है, लेकिन या तो कमांड के निष्पादन को मजबूर करता है या इसे पूरी तरह से त्याग देता है। लेकिन कोई अस्थायी चयन नहीं है या बफ़र्स को मारने की चिंता नहीं है, और कुछ अच्छे ट्वीक्स भी हैं, जैसे कि संपादक = vi

:wq            # execute the command
:cq            # cancel and abort
:! command     # execute command
:shell         # open a new shell
:r filename    # insert the contents of a file for editing
:r ! command   # insert the output of a command for editing

बहुत अच्छा विकल्प है। मैं vi-emacs-agnostic हूं, इसलिए पावरटूल की वास्तव में जरूरत पड़ने पर मैं इसका इस्तेमाल करके क्लैम के रूप में खुश रहूंगा। (Vi की बात करें, तो मैंने कुछ समय पहले N64 लाइनक्स एमुलेटर Mupen64Plus की कोशिश की थी। Esc बिना सेव किए एमुलेटर को क्विट कर देता है। मैंने जल्द ही कुछ भी खेलना छोड़ दिया।)
लॉरिट्ज वी। थुलो

1
@lazyr, debian / ubuntu के लिए दौड़ें sudo update-alternatives --config editorऔर अपना पसंदीदा संपादक चुनें। अन्य प्रणालियों के लिए EDITOR या VISUAL पर्यावरण चर को अपने पसंदीदा संपादक में सेट करें, उदाहरण के लिए export EDITOR=/usr/bin/nanoअपने .bashrc में जोड़ें ।
फोर्सफेक

3

#लाइन की शुरुआत में जोड़ने की विधि के समान , एक यकीनन सरल विधि है जिसका उपयोग मैं लाइन की शुरुआत में वापस करने की आवश्यकता नहीं करता हूं:

बस एक खुली बोली जोड़ें और इसे बंद न करें, चाहे सिंगल हो या डबल।

फिर दबाएं Enter

फिर दबाएं CtrlC

आंशिक कमांड कमांड हिस्ट्री में सेव की जाती है (एरो के माध्यम से उपलब्ध) लेकिन वास्तव में निष्पादित नहीं होती है।


2

Zsh का उपयोग करते हुए, यदि आप टाइप करते हैं <ESC> q(बच जाते हैं, तो Q), आपकी प्रॉम्प्ट लाइन कट जाएगी, जिससे आप दूसरी कमांड टाइप कर सकते हैं। आप अपने कट टेक्स्ट को अगले प्रॉम्प्ट में अपने आप वापस पा लेंगे।

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

यह सबसे कारगर तरीका नहीं है अगर आपको चेकिंग / तैयारी के लिए कई कमांड्स का उपयोग करना है (आपको <ESC> qप्रत्येक कमांड से पहले रीस्क्रिप्ट करना होगा )। लेकिन मुझे लगता है कि इसे छोटे शॉर्टकट से बांधना संभव है।


यदि आप केवल मैनुअल की जांच करना चाहते <ESC> hहैं, तो टाइप करें (बच जाएं, फिर एच)। जो run-helpतर्क के रूप में कमांड लाइन के पहले शब्द के साथ बिल्ट-इन चलाएगा । एक बार किए जाने पर आपको अपनी लाइन वापस मिल जाएगी।


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