कमांड लाइन पर पूंछ से पाठ को निष्पादित करने का सबसे आसान तरीका क्या है?


10

कभी-कभी मैं एक नए (ubuntu) बॉक्स पर काम कर रहा हूं और मैं टाइप करता हूं gitऔर सतर्क हो जाता हूं:

The program 'git' is currently not installed.  You can install it by typing:
apt-get install git-core

अगर ऐसा होता है तो मुझे पता है कि मैं कुछ ऐसा करके अंतिम पंक्ति को पकड़ सकता हूं:

!! 2>&1 | tail -n 1

लेकिन मैं उस ( apt-get install git-core) के परिणाम को सबसे आसानी से कैसे निष्पादित कर सकता हूं ?

मुझे एहसास है कि मैं कर सकता था

`!! 2>&1 | tail -n 1`

लेकिन वास्तव में आउटपुट को पाइप करने और इसे चलाने का एक तरीका भी है? यह काम नहीं लगता है:

!! 2>&1 | tail -n 1 | sh

इसके अलावा 2>&1भाग थोड़ा बोझिल है, इसलिए मुझे उत्सुकता होगी अगर ऐसा करने का एक आसान तरीका है।

संपादित करें

यह किसी भी तरह एक चर के लिए इसे बचाने के लिए स्वीकार्य होगा, और फिर चर को निष्पादित करें:

!! 2>&1 | tail -n 1 | (store as $mycmd)
$mycmd

लेकिन मुझे यकीन नहीं है कि मुझे stdoutएक चर में पाइप करने का तरीका पता है , कम से कम चर के साथ कमांड के दाईं ओर नहीं है।

जवाबों:


8

जब आप कमांड टाइप करते हैं जो आपके सिस्टम में मौजूद नहीं है तो फंक्शन रन करता है command_not_found_handle()। इस फ़ंक्शन में /usr/lib/command-not-foundस्क्रिप्ट के लिए एक कॉल है जो संदेशों को प्रिंट करता है।

उबुन्टु 12.04

stdoutइसके बजाय संदेशों को प्रिंट करने के लिए इस स्क्रिप्ट के स्रोत को बदलने के लिए मेरा पहला अनुमान है stderr, लेकिन जब मैं स्क्रिप्ट के स्रोत को पढ़ रहा था तो मैंने पाया कि आप इसे कॉन्फ़िगर करने के लिए पूछ सकते हैं कि क्या आप लापता पैकेज को स्थापित करना चाहते हैं।

यदि आप वैरिएबल निर्यात करते हैं, तो आपको COMMAND_NOT_FOUND_INSTALL_PROMPTलापता पैकेज स्थापित करने के लिए कहा जाएगा:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm: 

उबंटू के पुराने संस्करण

दुर्भाग्य से ऐसा नहीं है, COMMAND_NOT_FOUND_INSTALL_PROMPTइसलिए मुझे कुछ अन्य विकल्प मिल सकते हैं:

1) 12.04 से पैकेज स्थापित करें - यह समस्या नहीं होनी चाहिए - यह पायथन में केवल कुछ स्क्रिप्ट है इसलिए इसे काम करना चाहिए (अनट्रेड!)।

2) बदलें stderrकरने के लिए stdout। यह संपादित फ़ाइल ऐसा करने के लिए /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.pyऔर परिवर्तन stderrकरने के लिए stdoutलाइनों 237 और 240 में।

उसके बाद आप इसे इस तरह से उपयोग कर सकते हैं:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins

यदि आप 237 और 240 लाइनों में कमांड का -yविकल्प जोड़ते हैं तो आप apt-getसिंटैक्स का उपयोग भी कर सकते हैं !! | sh

३) आप इस लिपि को २४२ पंक्ति से इस प्रकार भी संशोधित कर सकते हैं:

print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()

इस तरह से आपको फ़ाइल में आपकी कमांड मिल जाएगी ~/.install-missing, जिससे आप उपनाम बना सकते हैं:

alias im="chmod +x ~/.install-missing; ~/.install-missing"

आप कॉल imपैकेज स्थापित किया जाएगा।


हम्म, यह वास्तव में अच्छा लग रहा था, लेकिन वास्तव में 11.10 वनिक पर काम नहीं करता है, /usr/lib/command-not-foundलेकिन COMMAND_NOT_FOUND_INSTALL_PROMPT- विचारों का कोई संदर्भ नहीं है ?
cwd

ठीक है, ऐसा लगता है कि यह एक विशेषता है जो 12.04 सटीक (( पैकेज-import.ubuntu.com/diffs/command-not-found ) का हिस्सा होगी । मुझे लगता है कि मुझे अभी भी पहले के संस्करणों के लिए एक समाधान की आवश्यकता है।
cwd

@cwd: मैंने अपना उत्तर अपडेट किया ...
pbm

3

आप सही रास्ते पर थे:

!! 2>&1 | tail -n 1 | sh

... लेकिन आप श का एक विकल्प याद कर रहे हैं । विचार करें:

!! 2>&1 | tail -n 1 | sh -s

और जब से आपको शायद एप-गेट चलाने के लिए रूट एक्सेस की आवश्यकता हो, विचार करें:

!! 2>&1 | tail -n 1 | sudo sh -s

यह काम नहीं करता है। sh और sh -s एक ही काम करता है, इस मामले में कम से कम।
दीपक मित्तल

1

आप ऐसा कुछ कर सकते हैं:

!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd

इंटरएक्टिव प्रोग्राम पाइपिंग के साथ अच्छी तरह से काम नहीं करते हैं क्योंकि यह इस मामले में एक इनपुट 'वाई' की उम्मीद करता है, लेकिन पहले कमांड खत्म होते ही स्टड फाइल डिस्क्रिप्टर बंद हो जाता है।


0

आप एक चर evalऔर कमांड प्रतिस्थापन का उपयोग कर सकते हैं, जो मुझे विश्वास है (हालांकि मुझे यकीन नहीं है कि यह सब कितना सुरक्षित होगा):

TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR

मैं ऊपर के साथ गलत साबित होने को तैयार हूं। मैं इसे रेड हैट मशीन पर echoकमांड के साथ परीक्षण कर रहा हूं बजाय इसके कि बैश पूरा होने वाले ऑटो सुझाव दें लेकिन सिद्धांत समान होना चाहिए।

दिन के अंत में, यह सिर्फ टाइप करने के लिए शीघ्रता से स्थापित किया जाएगा git ...

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