मैं इसे निष्पादित किए बिना वर्तमान शेल कमांड को कैसे संपादित करूं?


13

"एडिट-एंड-एक्ज़ीक्यूट-कमांड (Cx Ce)" का उपयोग करके अपने एडिटर का उपयोग करके कमांड को कैसे संपादित और निष्पादित करना है, इस पर काफी जानकारी मिलती है, लेकिन मैं जो हासिल करना चाहता हूं वह वर्तमान शेल कमांड लेना है, लागू करें कुछ फ़िल्टरिंग (एक स्क्रिप्ट का उपयोग करके) और फिर इसे निष्पादन से पहले आगे की मंजूरी / मैनुअल परिवर्तनों के लिए संकेत देने के लिए वापस लौटाएं। क्या यह बैश के साथ संभव है?


यह सवाल का सही जवाब नहीं है, लेकिन देशी बाश के बजाय ज़ेडएस टर्मिनल का उपयोग करने का प्रयास करें । यह स्वतः पूर्ण होता है इसलिए सीधे कमांड को निष्पादित न करें। मैंने व्यक्तिगत रूप से इस विशिष्ट परिदृश्य की कोशिश की है और जब भी मैं ऐसा करता हूं, तो मुझे हमेशा एंट्री दबाने की आवश्यकता होती है edit-and-execute-command
प्रवीण प्रेमरत्ने

1
शॉर्टकट जो मेरे लिए काम करता है Escape+ V, लेकिन यह अभी भी कमांड को निष्पादित करने वाला है। इसलिए वर्कअराउंड के लिए, मैं echoफ्रंट में रिव्यू के लिए कंसोल को कमांड प्रिंट करके निष्पादित करने के लिए जोड़ूंगा।
कीनोरब

2
क्या आप कृपया एक ठोस उदाहरण बना सकते हैं? मुझे समझ में नहीं आया "कुछ फ़िल्टरिंग (एक स्क्रिप्ट का उपयोग करके) लागू करें और फिर इसे शीघ्र करने के लिए वापस करें"।
केंट

3
@PraveenPremaratne: zsh एक टर्मिनल नहीं है , यह शेल है
अर्कादियुस डेर्स्कज़ीक

जवाबों:


7

मेरे अनुभव पर नवीनतम अपडेट

0"+y$ddनिम्नलिखित मानचित्रण में हिस्सा वास्तव में कुछ ऐसा है जिसे आपको सावधानीपूर्वक सोचना चाहिए और इसे अपने स्वाद / वर्कफ़्लो / अनुभव के अनुरूप होना चाहिए।

उदाहरण के लिए, बहुत बार मैंने खुद को बफर में कई लाइनों के साथ समाप्त होने के लिए पाया है, जहां मैं केवल उस कर्सर को निष्पादित करना चाहता हूं जिस पर कर्सर है; इस मामले में मैं 0"+y$dd:%d<CR>इसके बजाय का उपयोग कर सकते हैं 0"+y$dd

और यह संभावित परिदृश्यों में से एक है।

पसंद करने वालों के लिए अंतिम उत्तर vim

मूल उत्तर

मुझे अक्सर ऐसा ही करने की आवश्यकता होती है, और मैं इसे निम्नानुसार करता हूं। (मैं आमतौर पर set -o viइन का उपयोग करता हूं bash, इसलिए निम्न में से अंक 1 और 2 भिन्न हैं यदि आप उपयोग करते हैं set -o emacs, तो डिफ़ॉल्ट हैं। आपके प्रश्न के आधार पर ऐसा लगता है कि अंक 1 और 2 अंक में एकीकृत हैं Ctrl+ xद्वारा पीछा किया जाता है Ctrl+ e, जो टाइप करना कठिन है, imho ।)

  1. मारा Escapeसामान्य मोड में हो सकता है,
  2. हिट vआदेश संपादित करने के लिए संपादक में प्रवेश करने,
  3. जैसा मैं चाहता हूं, कमांड को संपादित करें,

(यह वह जगह है जहां आप सवाल पूछते हैं।)

  1. मारा Escape0"+y$dd:wq,
    • ध्यान दें: 0"+y$केवल नहीं "+yy, जैसा कि उत्तरार्द्ध भी नई पंक्ति की प्रतिलिपि बनाएगा, और इससे कमांड लाइन में इसे चिपकाने पर कमांड निष्पादित होगी,
  2. क्लिपबोर्ड को कमांड लाइन पर पेस्ट करें
    • यह कैसे करना है यह आपके द्वारा उपयोग किए जा रहे टर्मिनल पर निर्भर करता है, मुझे लगता है; मैं मारा Ctrl+ Alt+ vमें URxvt
  3. अनुमोदन / मैनुअल संपादन के लिए आगे बढ़ें।

स्पष्ट रूप से यह सिर्फ एक वर्कअराउंड है, जिसमें संपूर्ण कमांड को हटाने से पहले संपादित कमांड को क्लिपबोर्ड में कॉपी करना शामिल है, ताकि संपादक से बाहर निकलने पर कुछ भी निष्पादित न हो; हालाँकि यह मेरे लिए सबसे अच्छा हो सकता है।

अपडेट करें

जैसा कि मेरे EDITOR(और VISUAL) के बराबर है vim, जब मैं कमांड को संपादित करता हूं, तो मैं इसे संपादित करता हूं vim

इस संबंध में, मैंने देखा है कि बफर का नाम है /tmp/bash-fc.random, जहां random6-वर्ण अल्फ़ान्यूमेरिक यादृच्छिक स्ट्रिंग है।

यदि आप vimअपने संपादक के रूप में उपयोग करते हैं, तो यह बहुत सारे व्यवसायों को स्थान देता है , क्योंकि आप .vimrcपूरे अनुक्रम को निष्पादित करने के लिए कुछ मैपिंग को परिभाषित कर सकते हैं Escape0"+y$dd:wq। उदाहरण के लिए, एक कमांड जिसे आप कमांड लाइन को संपादित करते समय शायद ही कभी उपयोग करेंगे Leaderd; इसलिए आप mapअपनी .vimrcफ़ाइल में निम्न पिंग डाल सकते हैं

au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>

ताकि उपरोक्त नुस्खा में चरण 4 बन जाए

  1. मारो EscapeLeaderd

मेरे लिए यह कमांड संपादित करने का सबसे अच्छा तरीका है
A.Villegas

2

बैश / रीडलाइन में ऐसा करना संभव नहीं है, लेकिन edit-command-lineकमांड का उपयोग करके zsh में यह संभव है :

darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line

अब प्रेस Control- x Control- eअपने संपादक को खोलने के लिए, पंक्ति को संपादित करें, संपादक को छोड़ दें - आपको अद्यतन कमांड लाइन दिखाई देगी लेकिन यह स्वचालित रूप से निष्पादित नहीं होगी।


1

अब जब मैं इसके बारे में सोचता हूं, तो शायद एक टिप्पणी में सुझाए गए @kenorb की भिन्नता सबसे अच्छा समाधान है (क्योंकि ऐसा लगता है कि कोई समाधान मौजूद नहीं है), अगर हम छड़ी करना चाहते हैं bash

आप जो कर सकते हैं, वह #(टिप्पणी चरित्र में bash) कमांड के बजाय प्रीपेंड करना है echo। तब जब आप निर्वासक से बाहर निकलते हैं, तो कमांड अप्रभावी हो जाएगी, और आपको केवल प्रेस करना होगा arrow up(या k, यदि आप उपयोग करते हैं set -o vi), तो हटाएं #और पुष्टि करें।

ध्यान दें कि यह रणनीति बस कुछ कीस्ट्रोक्स जोड़ती है, इसलिए यह आपके टाइपिंग स्तर के आधार पर काफी कुशल हो सकती है।


1

ये टुकड़े आपको करीब ला सकते हैं:

a) नईलाइन के लिए सामान्य बाइंडिंग की जगह नईलाइन (ctrl-M) bind -x '"\C-M":date"

बी) का उपयोग करके इतिहास से वर्तमान लाइन को पकड़ो !#

जो भी स्क्रिप्ट आपको चाहिए, उसके साथ डेट बदलें।

ग) मैन्युअल रूप से संपादित करें

घ) यदि आवश्यक हो, तो किसी तरह टाई करें !!:pजिसमें नए कमांड को कमांड लाइन में प्रिंट करता है लेकिन इसे निष्पादित नहीं करता है, इस प्रकार आपको मैन्युअल रूप से इसे संपादित करने देता है।

ई) नई लाइन के बजाय ctrl-J सबमिट एडिट कमांड का उपयोग करना

या वे नहीं हो सकता है ...।


1

इतिहास से कमांड को संशोधित करने के लिए इसे संशोधित करने के लिए बैश में एक विकल्प है। मुझे यकीन नहीं है कि इसके लिए स्क्रिप्ट का उपयोग करना संभव है, संभावना नहीं लगती है। यद्यपि, आप इतिहास संशोधक का उपयोग करके संशोधन कर सकते हैं।

  1. संशोधित कमांड के निष्पादन को रोकने के लिए विकल्प histverify सक्षम करें
  2. अंतिम आदेश को बदलने के लिए संशोधक की श्रृंखला का उपयोग करें
  3. उपयोग "!!" अंतिम संपादन के लिए कमांड लाइन में अपना परिणाम डालने के लिए

यहाँ है कि यह कैसा दिखता है:

$ shopt -s histverify
$ ls *.sh
script1.sh  script2.sh  script3.sh  script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh

1

मैं आपको बैश के लिए कम्पोज़िशन फ्रेमवर्क की ओर इंगित करना चाहता हूं (मैं इसके साथ संबद्ध नहीं हूं): https://github.com/erichs/comureure

यह प्रदान करता है draftऔर reviseकार्य करता है जैसे कि वे ध्वनि करते हैं जो आप करने की कोशिश कर रहे हैं। यहाँ प्रोजेक्ट की रीडमे फ़ाइल से एक लंबी (लंबी) बोली है:

कम्पोज़िशन आपको सरल शेल फ़ंक्शंस का मसौदा तैयार करने में मदद करता है, जो आपके लंबे पाइप फिल्टर और जटिल कमांड को पठनीय और पुन: प्रयोज्य विखंडू में तोड़ देता है।

पहले ड्राफ्ट करें, बाद में प्रश्न पूछें

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

  $ cat servers.txt
  bashful: up
  doc: down

  up-arrow

  $ cat servers.txt | grep down
  doc: down

  $ draft finddown

  $ finddown | mail -s "down server(s)" admin@here.com

रिवाइज, रिवाइज, रिवाइज!

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

  • इनपुट मापदंडों के साथ कार्यों को सामान्य करें
  • कार्यक्षमता जोड़ें या निकालें
  • प्रलेखन के लिए सहायक मेटाडेटा जोड़ें

    $ revise finddown
    finddown ()
    {
      about finds servers marked 'down' in text file
      group admin
      cat $1 | grep down
    }
    
    $ finddown servers.txt
    doc: down

0

यह कीबोर्ड शॉर्टकट से संभव नहीं लगता, कम से कम:

$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.