কমান্ড লাইনে লেজ থেকে পাঠ্য সম্পাদন করার সহজতম উপায় কী?


10

কখনও কখনও আমি একটি নতুন (উবুন্টু) বাক্সে কাজ করছি এবং আমি টাইপ করে 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

3) আপনি 242 লাইন থেকে এই স্ক্রিপ্টটিও এভাবে পরিবর্তন করতে পারেন:

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পেলে ইনস্টল করা হবে।


হুম, এটি দেখতে সত্যিই ভাল লাগছিল কিন্তু বাস্তবে 1110 একরিকের সাথে কাজ করছে বলে মনে হচ্ছে না, /usr/lib/command-not-foundতবে এর কোনও উল্লেখ নেই COMMAND_NOT_FOUND_INSTALL_PROMPT- চিন্তাভাবনা?
cwd

ঠিক আছে, দেখে মনে হচ্ছে এটি এমন একটি বৈশিষ্ট্য যা 12.04 সুনির্দিষ্ট অংশের অংশ হবে ( প্যাকেজ-import.ubuntu.com/diffs/command-not-found )। আমার ধারণা আমার আগের সংস্করণগুলির জন্য আমার এখনও একটি সমাধান প্রয়োজন।
cwd

@ সিডব্লিউড: আমি আমার উত্তর আপডেট করেছি ...
পিবিএম

3

আপনি এর সাথে সঠিক পথে ছিলেন:

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

... তবে আপনি 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কমান্ডের সাথে বাশ সম্পূর্ণ হওয়ার স্বয়ংক্রিয় পরামর্শের চেয়ে পরীক্ষা করছি তবে নীতিটি একই হওয়া উচিত।

দিনের শেষে, কেবল অ্যাপটিটিউড ইনস্টল গিটটি টাইপ করা আরও দ্রুত হবে ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.