क्या बैश इतिहास में आदेशों की एक श्रृंखला को क्रियान्वित करने का शॉर्टकट मौजूद है?


20

मान लीजिए कि मेरे पास निम्नलिखित तुच्छ उदाहरण हैं history:

...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...

अगर मैं आदेश पर अमल करना चाहता था 77, 78और 79एक आदेश में, वहाँ इस के लिए एक शॉर्टकट मौजूद है? मैंने कोशिश की है !77 !78 !79, जो बस उन सभी को निष्पादित करने के लिए एक ही लाइन पर रखेगा।


9
है !77 ; !78 ; !79ठीक?
thrig

1
मुझे लगता है कि लाइन से लाइन टाइप करने में कुछ भी कमी है, ठीक है, लेकिन कुछ और अधिक संक्षिप्त (लाइनों के साथ !77-79) के लिए उम्मीद कर रहा था
MrDuk

1
@ मृदुक, लड़के ने मुझे याद करने के लिए कुछ समय लिया। बहुत संक्षिप्त समाधान के लिए मेरा अद्यतन उत्तर देखें ! :)
वाइल्डकार्ड

यह जादुई है! :)
मृदु

जवाबों:


28

संपादित करें: आप इसे POSIX- अनुरूप फैशन में फिक्स कमांड टूल केfc साथ कर सकते हैं :

fc 77 79

यह आपके संपादक (शायद vi) को बफ़र में 79 के माध्यम से 77 के साथ खोल देगा । जब आप सहेजते हैं और बाहर निकलते हैं ( :x), कमांड चलाए जाएंगे।


यदि आप उन्हें संपादित नहीं करना चाहते हैं और आपको पता चल रहा है कि आपको पता है कि आप किस आदेश पर कॉल कर रहे हैं, तो आप इसका उपयोग कर सकते हैं:

fc -e true 77 79

यह trueकमांड्स को संपादित करने के लिए एक "एडिटर" के रूप में उपयोग करता है , इसलिए यह बिना कोई बदलाव किए ही बाहर निकल जाता है और कमांड्स को जैसे-तैसे चलाया जाता है।


मूल ANSWER:

आप उपयोग कर सकते हैं:

history -p \!{77..79} | bash

यह मानता है कि आप किसी भी उपनाम या फ़ंक्शन या किसी भी चर का उपयोग नहीं कर रहे हैं जो केवल वर्तमान निष्पादन वातावरण में मौजूद हैं, निश्चित रूप से वे नए शेल में उपलब्ध नहीं होंगे।


एक बेहतर समाधान (टिप्पणी में मुझे याद दिलाने के लिए माइकल हॉफमैन के लिए धन्यवाद) है:

eval "$(history -p \!{77..79})"

बहुत कम मामलों में से एक, जहां evalवास्तव में उपयुक्त है!


और देखें:


2
यह सही ढंग से काम नहीं करेगा यदि कोई भी कमांड मौजूदा निष्पादन वातावरण को बदलता है, उदाहरण के लिए, एक चर को बदलकर या ए cd, लेकिन यह एक किनारे का मामला है।
जी-मैन का कहना है कि 'मोनिका'

3
eval "$(history -p \!{77..79})"कार्य करना चाहिए।
माइकल हॉफमैन

1
@MichaelHoffman, मैंने उस बारे में सोचा था और सोचा था कि मैंने इसे आज़माया था, लेकिन मुझे बस एहसास हुआ कि मैंने छोड़ दिया है! डी 'ओह! कोई आश्चर्य नहीं कि यह काम नहीं किया ... अब जवाब का संपादन।
वाइल्डकार्ड

14

सरल उत्तर: इसके बजाय !77 !78 !79,

  • टाइप !77; !78; !79करने के लिए आप क्या करने की कोशिश कर लगता है - आदेश 77 पर अमल करें, और तब आदेश 78, और उसके बाद आदेश 79, बिना शर्त, या
  • !77 && !78 && !79 कमांड 77 निष्पादित करने के लिए टाइप करें और जांचें कि क्या यह सफल हुआ। और फिर, यदि कमांड 77 सफल हुआ, कमांड 78 को निष्पादित करें। और यदि कमांड 78 सफल हुआ, तो कमांड 79 को निष्पादित करें।

थोड़ा चालाक जवाब (यदि आप एक टर्मिनल प्रकार की खिड़की में हैं):

  • यह पता लगाएं कि आपके द्वारा टाइप किया जाने वाला अगला कमांड नंबर क्या होगा।
    • इसे अपने प्रॉम्प्ट में शामिल करना संभव है; मेरा मानना ​​है कि यह \!आपके में शामिल है PS1
    • या अपनी इतिहास सूची देखें। यदि अंतिम प्रविष्टि है 82 history, तो आपकी अगली कमांड 83 है।
  • घटाव 83 =77 = 6।
  • टाइप करें !-6। यह कमांड 77 को फिर से निष्पादित करेगा।
  • !-6उसे कॉपी करें , कॉपी करें और पेस्ट करें। चूंकि आपके आदेश 77 ( ./generator.sh) का पुन: क्रियान्वयन 83 था, अब आप कमांड 84 पर हैं, इसलिए !-6आदेश 78 को फिर से निष्पादित करेंगे।
  • !-6वांछित के रूप में चिपकाने को दोहराएं ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.