मैं अंतिम कमांड को फ़ाइल में कैसे सहेज सकता हूं?


29

जब मैं बैश शेल का उपयोग करके अपने विश्लेषण चला रहा हूं, तो मैं अक्सर उन कमांड को सहेजना चाहता हूं जो मैंने उपयोग किए हैं जो मुझे उसी निर्देशिका में एक फ़ाइल के लिए अच्छे परिणाम देता है (मेरा "लॉगबुक", जैसा कि इसके तथाकथित) ताकि मैं जांच कर सकूं कि मैं क्या कर सकता हूं मैंने उन परिणामों को प्राप्त करने के लिए किया। अब तक यह मेरा मतलब है कि या तो कॉपी करें। टर्मिनल से कमांड को चखना या कमांड को "ऊपर" दबाकर ए echo"my command" >> LOGBOOK, या अन्य समान कॉमिक्स को संशोधित करना ।

मैंने पाया historyकि दूसरे दिन एक उपकरण था , लेकिन मैं इसे पहले से निष्पादित कमांड प्राप्त करने के लिए इसका उपयोग करने का एक तरीका नहीं ढूंढ सकता हूं ताकि मैं कुछ ऐसा कर सकूं getlast >> LOGBOOK

क्या ऐसा करने का एक अच्छा आसान तरीका है। वैकल्पिक रूप से, अन्य लोग अपने पास मौजूद परिणामों के लिए आदेशों को सहेजने से कैसे निपटते हैं?

जवाबों:


37

यदि आप उपयोग कर रहे हैं bash, तो आप fcअपने इतिहास को अपनी इच्छानुसार प्रदर्शित करने के लिए कमांड का उपयोग कर सकते हैं:

fc -ln -1

यह आपकी अंतिम कमांड का प्रिंट आउट लेगा। -lसूची का अर्थ है, -nकमांड संख्याओं के साथ उपसर्ग न करने का मतलब है और -1अंतिम आदेश दिखाने के लिए कहते हैं। यदि लाइन के प्रारंभ में व्हॉट्सएप (केवल मल्टी-लाइन कमांड पर पहली पंक्ति) परेशान है, तो आप आसानी से उस से छुटकारा पा सकते हैं sed। एक शेल फ़ंक्शन में बनाएं, और आपके पास अनुरोध के रूप में एक समाधान है ( getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

जैसा कि आपने अपने प्रश्न में पूछा है, कार्य करना चाहिए।

मैं जोड़कर एक मामूली बदलाव को शामिल किया है "$1" "$1"करने के लिए fcआदेश। यह आपको उदाहरण के लिए, getlast mycommandअंतिम कमांड लाइन को इनवॉइस करने के लिए कहने की अनुमति देगा mycommand, इसलिए यदि आप किसी अन्य कमांड को चलाने से पहले सहेजना भूल गए हैं, तो आप अभी भी आसानी से कमांड के अंतिम उदाहरण को बचा सकते हैं। यदि आप एक तर्क पास नहीं करते हैं getlast(जैसे कि आह्वान fcकरते हैं fc -ln "" "", तो यह केवल अंतिम कमांड को प्रिंट करता है)।

[नोट: @ ब्रैम की टिप्पणी और @glenn jackman के उत्तर में उल्लिखित मुद्दे के लिए जवाब देने के लिए संपादित किया गया है।]


5
पहले फॉर्म fc -lnr | head -n 1को संक्षिप्त किया जा सकता है fc -lnr -1
ब्राम

@ ब्राम: अच्छा सामान। मैं help fcअपने प्रलेखन के लिए उपयोग कर रहा था । बैश मैन पेज में अधिक विवरण हैं, जिसमें नकारात्मक सूचकांकों का उपयोग शामिल है। खत्म headकरना अच्छा है क्योंकि जो एक कमांड बचा है वह अंतर्निहित है, इसलिए अब कोई कांटा / निष्पादन नहीं है।
camh

1
मुझे आश्चर्य है कि कमांड क्यों कहा जाता है fc...
imz - इवान ज़खरीशेव

2
यह "फिक्स कमांड" के लिए खड़ा है। gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
मिकेल

9

@ कैम के जवाब के साथ एक समस्या यह है कि यदि आपके पास एक कमांड है जो कई लाइनों को फैलाता है, तो यह केवल पहली पंक्ति दिखाता है:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

इसे इस्तेमाल करे:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"

3
सक्षम करने से cmdhistयह ठीक हो जाएगा: "यदि सेट किया गया है, तो एक ही इतिहास प्रविष्टि में कई-लाइन कमांड की सभी पंक्तियों को सहेजने का प्रयास करता है। यह मल्टी-लाइन कमांड के आसान पुनः संपादन की अनुमति देता है।"
मार्क मेकिन्सट्री

2

अप एरो का उपयोग करने के बजाय, आप "!!"पिछले कमांड को संदर्भित करने के लिए उपयोग कर सकते हैं ।

जैसे

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

नोट: यह शाब्दिक पाठ को उद्धृत नहीं करता है


5
यह शाब्दिक आदेश पर कब्जा नहीं करेगा। यदि कोई शेल मेटाचैकर हैं, तो उनका मूल्यांकन और प्रतिस्थापन किया जाएगा। पाइपलाइन भी टूट जाएगा: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK
camh

0

यदि आप bash शेल का उपयोग कर रहे हैं तो आप निम्न कमांड के साथ कर सकते हैं:

$> history -a LOGBOOK

यह आपके सभी आदेशों को वर्तमान सत्र से उस फ़ाइल में जोड़ देगा, आप एक एकल आदेश के साथ ऐसा करने के लिए अपनी ~ / .bashrc फ़ाइल पर एक उपनाम भी जोड़ सकते हैं:

$> alias getlast="history -a LOGBOOK"

1
लेकिन आप अधिक महत्वपूर्ण आवश्यकता को याद कर रहे हैं कि मैं केवल उन कमांड को सहेजता हूं जो काम करते हैं और मेरे पास परिणाम हैं। मैं हाल ही में किए गए सभी आदेशों को सहेजना नहीं चाहता , बस उनका चयन करने के बाद मैं उनका उपयोग कर रहा हूं। फिर भी धन्यवाद।
मैटलबेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.