इतिहास से लगातार कमांड कैसे निष्पादित करें?


49

मान लीजिए कि मैं चार कमांड के एक अनुक्रम को निष्पादित करना चाहता हूं जिसे मैंने पहले निष्पादित किया है। यदि कमांड-हिस्ट्री में पहला 432 है, तो मैं कर सकता था:

$ !432; !433; !434; !435

मैं उत्सुक हूं, क्या इसे पूरा करने का एक अधिक कुशल तरीका है?


1
इसे उत्तर के रूप में पोस्ट नहीं कर रहा है क्योंकि यह कमांड निष्पादित नहीं करता है , लेकिन आप history -p \!43{2..5}टर्मिनल पर 435 के माध्यम से कमांड 432 प्रिंट करने के लिए टाइप कर सकते हैं , बाद की कॉपी / पेस्ट के लिए उपयुक्त है।
वाइल्डकार्ड

जवाबों:


48

यदि यह हाल ही में चलाए गए आदेशों को संदर्भित करता है, तो नकारात्मक संख्याओं के साथ उन्हें संदर्भित करने के लिए एक अधिक कुशल तरीका है:

!-4; !-3; !-2; !-1

इसके अलावा, एक बार ऐसा करने के बाद, आपकी पिछली इतिहास प्रविष्टि में कमांड की पूरी श्रृंखला होगी, इसलिए आप इसे दोहरा सकते हैं !!


संपादित करें: आप पहले से ही नहीं है, तो महान builtin समारोह से परिचित हो fc, गाइल्स ने उल्लेख किया । (उपयोग करें help fc।) यह पता चला है कि आप इसके साथ नकारात्मक संख्याओं का भी उपयोग कर सकते हैं, इसलिए आप ऊपर दिए गए उपयोग की तरह ही कर सकते हैं

eval "`fc -ln -4 -1`"

यह एक चेतावनी है, हालांकि: इसके बाद, evalलाइन को अंतिम आदेश के रूप में इतिहास में संग्रहीत किया जाता है। इसलिए यदि आप इसे फिर से चलाते हैं, तो आप एक पाश में पड़ जाएंगे!

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

 fc -4 -1

तुम भी आदेशों की सीमा के क्रम को उल्टा कर सकते हैं: fc -1 -4


मैंने अभी-अभी पढ़ा कि मैंने क्या लिखा ... LOL। असल में, मैं रीइनवोक के बारे में निश्चित नहीं हूं ( शायद फिर से आह्वान करें ?), लेकिन यह बताने के लिए धन्यवाद :) मैं हमेशा सुधार की सराहना करता हूं।
रोज़ज़ेट्रिएवेज़ेज़

Scrabblefinder.com का कहना है कि reinvoke एक वैध स्क्रैबल शब्द है। उस से अधिक निश्चित नहीं मिल सकता है। :)

1
इस तरह के एक अच्छे उत्तर के साथ (+1), इससे कोई फर्क नहीं पड़ता कि आपने इसे कैसे वर्तनी दिया है; विशेष रूप से न तो वर्तनी प्रपत्र 3 प्रमुख अंग्रेजी शब्दकोशों में दिखाई देता है: ऑक्सफोर्ड, कैमग्रेज़, मेरियम-वेबस्टर (मैं हाइफ़न के लिए
जाऊंगा

34

इतिहास में कई कमांड देखने के लिए अंतर्निहित fcकमांड का उपयोग करें :

fc -ln 432 435

उन्हें फिर से निष्पादित करने के लिए:

eval "$(fc -ln 432 435)"

4
बहुत अच्छा। मैं उत्सुक हूँ, हालांकि, man fcमुझे कुछ भी क्यों नहीं देता। किसलिए fcखड़ा है? इसमें और अन्य क्या विकल्प हैं?
एरिक विल्सन

2
@ एरिक विल्सन ... टाइप help fc... और भी help help.... मदद: मदद [-dms] [पैटर्न ...] बिलिन कमांड के बारे में जानकारी प्रदर्शित करें।
पीटर।

मैं बस यहाँ वापस आया, आपके जवाब की तलाश में। यह वास्तव में एक महान बिलिन है! विशेष रूप से तब जब आप इसकी डिफ़ॉल्ट कार्यक्षमता हो - फिर से शुरू करने के लिए कमांड की एक सीमा को संशोधित करने के लिए एक संपादक को आमंत्रित करना। धन्यवाद, गाइल्स।
rozcietrzewiacz

1
-lध्वज के बिना , यह बुराई की आवश्यकता के बिना निष्पादित करेगा eval
बर्नहार्ड

1
@EricWilson एक Google खोज मुझे "यूनिक्स इन नटशेल" पुस्तक की ओर ले जाती है, जो कहती fcहै कि "कमांड ढूंढें" या "फिक्स कमांड" के लिए है।
स्लॉथवर्क्स

10

बैश इतिहास से क्रम में कई कमांड चलाने का एक अच्छा और वैकल्पिक तरीका है:
इतिहास स्थानापन्न ( !432या !-4) का उपयोग करने के बजाय , आप इतिहास को Ctrl+ के साथ खोज सकते हैं r, और एक बार जब आप चाहते हैं तो पहली कमांड मिल जाएगी। कुंजी के बजाय रन, हिट Ctrl+ o( -और-गेट-नेक्स्ट ) यह कमांड लॉन्च करेगा और अगले एक को इतिहास से प्रस्तावित करेगा । आप जितनी बार चाहें उतनी बार हिट कर सकते हैं , और अनुक्रम को अंतिम रूप से समाप्त कर सकते हैं , या इसे लॉन्च किए बिना रोक सकते हैं।return
Ctrl+oreturnCtrl+c


हम्म, मैं Ctrl-oइसे हिट करने के बाद सिर्फ एक शाब्दिक आउटपुट ^oदेता हूं और मेरी टूट जाती है (reverse-i-search)। हो सकता है कि कुछ अन्य सेटिंग शामिल हो।
सिरो सेंटिल्ली 新疆 改造 i i 事件 '

8

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

fc -e: 432 435

बृहदान्त्र का तर्क -e bash noop है, जिसका प्रभाव "संपादक में खुले" कदम को छोड़ना पड़ता है, जो fc चाहता है। इसके अलावा, अब (हाल के) इतिहास में इतिहास से वास्तविक आदेश होंगे, बजाय स्पष्ट कथन के।


0

fc पाश के लिए और xsel

जब मैं अंतिम n कमांड को कई बार जोड़ना और फिर से चलाना चाहता हूं तो यह अच्छी तरह से काम करता है:

fcn() (
  from="${1:-2}"
  to="${2:-1}"
  if [ "$from" -ne "$to" ]; then
    for i in `seq "$from" -1 "$(($to + 1))"`; do
      printf "$(fc -ln -${i} -${i}) && "
    done
  fi
  printf "$(fc -ln -${to} -${to})"
)

फिर:

$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$  echo a &&  echo b &&  echo c
a
b
c
$ # Paste again if you feel like it.
$  echo a &&  echo b &&  echo c
a
b
c

या बड़े आदेशों के लिए जिन्हें कुछ संपादन की आवश्यकता हो सकती है:

fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.