मान लीजिए कि मैं चार कमांड के एक अनुक्रम को निष्पादित करना चाहता हूं जिसे मैंने पहले निष्पादित किया है। यदि कमांड-हिस्ट्री में पहला 432 है, तो मैं कर सकता था:
$ !432; !433; !434; !435
मैं उत्सुक हूं, क्या इसे पूरा करने का एक अधिक कुशल तरीका है?
मान लीजिए कि मैं चार कमांड के एक अनुक्रम को निष्पादित करना चाहता हूं जिसे मैंने पहले निष्पादित किया है। यदि कमांड-हिस्ट्री में पहला 432 है, तो मैं कर सकता था:
$ !432; !433; !434; !435
मैं उत्सुक हूं, क्या इसे पूरा करने का एक अधिक कुशल तरीका है?
जवाबों:
यदि यह हाल ही में चलाए गए आदेशों को संदर्भित करता है, तो नकारात्मक संख्याओं के साथ उन्हें संदर्भित करने के लिए एक अधिक कुशल तरीका है:
!-4; !-3; !-2; !-1
इसके अलावा, एक बार ऐसा करने के बाद, आपकी पिछली इतिहास प्रविष्टि में कमांड की पूरी श्रृंखला होगी, इसलिए आप इसे दोहरा सकते हैं !!
।
संपादित करें:
आप पहले से ही नहीं है, तो महान builtin समारोह से परिचित हो fc
, गाइल्स ने उल्लेख किया । (उपयोग करें help fc
।) यह पता चला है कि आप इसके साथ नकारात्मक संख्याओं का भी उपयोग कर सकते हैं, इसलिए आप ऊपर दिए गए उपयोग की तरह ही कर सकते हैं
eval "`fc -ln -4 -1`"
यह एक चेतावनी है, हालांकि: इसके बाद, eval
लाइन को अंतिम आदेश के रूप में इतिहास में संग्रहीत किया जाता है। इसलिए यदि आप इसे फिर से चलाते हैं, तो आप एक पाश में पड़ जाएंगे!
ऐसा करने का एक सुरक्षित तरीका डिफ़ॉल्ट fc
ऑपरेशन मोड का उपयोग करना है: एक संपादक को चयनित कमांड की सीमा को अग्रेषित करना और इससे बाहर निकलने के बाद उन्हें चलाना। प्रयत्न, कोशिश:
fc -4 -1
तुम भी आदेशों की सीमा के क्रम को उल्टा कर सकते हैं: fc -1 -4
इतिहास में कई कमांड देखने के लिए अंतर्निहित fc
कमांड का उपयोग करें :
fc -ln 432 435
उन्हें फिर से निष्पादित करने के लिए:
eval "$(fc -ln 432 435)"
man fc
मुझे कुछ भी क्यों नहीं देता। किसलिए fc
खड़ा है? इसमें और अन्य क्या विकल्प हैं?
help fc
... और भी help help
.... मदद: मदद [-dms] [पैटर्न ...] बिलिन कमांड के बारे में जानकारी प्रदर्शित करें।
-l
ध्वज के बिना , यह बुराई की आवश्यकता के बिना निष्पादित करेगा eval
।
fc
है कि "कमांड ढूंढें" या "फिक्स कमांड" के लिए है।
बैश इतिहास से क्रम में कई कमांड चलाने का एक अच्छा और वैकल्पिक तरीका है:
इतिहास स्थानापन्न ( !432
या !-4
) का उपयोग करने के बजाय , आप इतिहास को Ctrl+ के साथ खोज सकते हैं r, और एक बार जब आप चाहते हैं तो पहली कमांड मिल जाएगी। कुंजी के बजाय रन, हिट Ctrl+ o( -और-गेट-नेक्स्ट )
यह कमांड लॉन्च करेगा और अगले एक को इतिहास से प्रस्तावित करेगा । आप जितनी बार चाहें उतनी बार हिट कर सकते हैं , और अनुक्रम को अंतिम रूप से समाप्त कर सकते हैं , या इसे लॉन्च किए बिना रोक सकते हैं।return
Ctrl+oreturnCtrl+c
Ctrl-o
इसे हिट करने के बाद सिर्फ एक शाब्दिक आउटपुट ^o
देता हूं और मेरी टूट जाती है (reverse-i-search)
। हो सकता है कि कुछ अन्य सेटिंग शामिल हो।
आदेशों को तुरंत संपादित करने के बजाए उन पर अमल करने के लिए, यहाँ गाइल्स उत्तर के एक सिलेक्टिक रूप से स्लिमर संस्करण का उपयोग किया गया है :
fc -e: 432 435
बृहदान्त्र का तर्क -e bash noop है, जिसका प्रभाव "संपादक में खुले" कदम को छोड़ना पड़ता है, जो fc चाहता है। इसके अलावा, अब (हाल के) इतिहास में इतिहास से वास्तविक आदेश होंगे, बजाय स्पष्ट कथन के।
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
history -p \!43{2..5}
टर्मिनल पर 435 के माध्यम से कमांड 432 प्रिंट करने के लिए टाइप कर सकते हैं , बाद की कॉपी / पेस्ट के लिए उपयुक्त है।