ব্যাশে আউটপুটের শেষ লাইনটি কীভাবে সম্পাদন করতে পারি?


12

আমি জানি যে আমি ব্যাশ-এ শেষ কমান্ডটি চালাতে পারি !!, তবে কীভাবে আমি আউটপুটের শেষ লাইনটি চালাতে পারি?

আমি এই আউটপুটটির ব্যবহারের ক্ষেত্রে ভাবছি:

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

কিন্তু আমি জানি না যে আমি কীভাবে এটি চালাতে পারি। আমি ভাবছি এর মতো কিছু !!, হয়তো @@বা অনুরূপ?


সুপার ব্যবহারকারীরও এই প্রশ্ন রয়েছে।


1
আপনি কেবল এটি অনুলিপি করে পেস্ট করবেন না কেন?
পাইলট

1
@ টিম আপনি কোনও প্রোগ্রামের আউটপুটটির শেষ লাইনটি চালনার উপায়গুলি চান তবে এই বিশেষ ব্যবহারের ক্ষেত্রে command_not_found_handleশেল ফাংশন বা এটি চালিত স্ক্রিপ্ট পরিবর্তন করার পদ্ধতিও রয়েছে (সাধারণত স্রেফ /usr/lib/command-not-found)। আমি মনে করি আপনি এটি তৈরি করতে পেরেছিলেন যাতে আপনি প্যাকেজটি স্বয়ংক্রিয়ভাবে ইনস্টল করার বিকল্পের সাথে ইন্টারেক্টিভভাবে অনুরোধ করা হয়েছিল, বা (সম্ভবত আরও ভাল) যাতে প্যাকেজের নামটি কোথাও সঞ্চিত থাকে এবং একটি শর্ট কমান্ড চালিয়ে ইনস্টল করা যায়। আপনি এখানে যা চেয়েছিলেন তা থেকে এটি যথেষ্ট আলাদা, আপনি এটি সম্পর্কে একটি পৃথক প্রশ্ন পোস্ট করার বিষয়টি বিবেচনা করতে পারেন।
এলিয়াহ কাগন


2
এছাড়াও প্রাসঙ্গিক হতে পারে: github.com/nvbn/thefuck (নামটি উপেক্ষা করুন) এই সরঞ্জামটি গিট /
অ্যাপট

উত্তর:


16

কমান্ডটি করা $(!! |& tail -1)উচিত:

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

$ $(!! |& tail -1)
$(git something |& tail -1)
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
git-man liberror-perl

আপনি দেখতে পাচ্ছেন sudo apt-get install gitকমান্ড চলমান আছে।

সম্পাদনা: ভেঙে যাচ্ছে$(!! |& tail -1)

  • $()হয় bashকমান্ড প্রতিকল্পন প্যাটার্ন

  • bash!!শেষ সম্পাদিত কমান্ড প্রসারিত হবে

  • |&অংশটি জটিল। সাধারণত পাইপ |বাম দিকের কমান্ডের STDOUT নেবে এবং এটি ডানদিকে কমান্ডে STDIN হিসাবে প্রেরণ করবে |, আপনার ক্ষেত্রে আগের কমান্ডটি একটি ত্রুটি বার্তা হিসাবে STDERR এ তার আউটপুট মুদ্রণ করে। সুতরাং, করা |সাহায্য করবে না, আমাদের এসটিডিআউট এবং এসটিডিআরআর (বা কেবল এসটিডিআরআর) উভয়ই ডান পার্শ্বযুক্ত কমান্ডে পাস করতে হবে। |&STDOUT এবং STDERR উভয়ই STDIN হিসাবে ডান পার্শ্বযুক্ত কমান্ডে পাস করবে। পর্যায়ক্রমে, আরও ভাল আপনি কেবল এসটিডিআরআর পাস করতে পারবেন:

    $(!! 2>&1 >/dev/null | tail -1)
  • tail -1যথারীতি এর ইনপুট থেকে শেষ লাইনটি মুদ্রণ করবে। এখানে সর্বশেষ লাইনটি প্রিন্ট করার পরিবর্তে আপনি আরও সুনির্দিষ্ট হতে পারেন যেমন লাইনটি apt-get installকমান্ডটি মুদ্রণ করার জন্য :

    $(!! 2>&1 >/dev/null | grep 'apt-get install')

1
আপনার পদ্ধতির ধারণা ধরে রাখুন আউটপুট প্রায় দ্বিতীয়বারের মতো হবে। কিছু কমান্ড পরের বারের সময় একটি ভিন্ন আউটপুট উত্পাদন করতে পারে, এক্ষেত্রে এটির আউটপুটটির শেষ লাইনটি কার্যকর করতে আসলে কী ঘটছে তা অনুমান করা খুব কঠিন।
কাস্পারড

1
@ ক্যাস্পারড আপনি ঠিক বলেছেন .. যতক্ষণ এই সুনির্দিষ্ট উদাহরণের সাথে সম্পর্কিত, আউটপুট একই হওয়া উচিত ..
হিমাইল

7

টি এল; ডিআর: alias @@='$($(fc -ln -1) |& tail -1)'

বাশের ইতিহাসের ইন্টারঅ্যাকশন সুবিধাগুলি কমান্ডের আউটপুট পরীক্ষা করার জন্য কোনও প্রক্রিয়া সরবরাহ করে না। শেলটি এটি সংরক্ষণ করে না এবং ইতিহাসের সম্প্রসারণটি বিশেষত আপনার নিজের দ্বারা চালিত কমান্ডগুলির জন্য বা সেই আদেশগুলির কিছু অংশ parts

এটি শেষ কমান্ডটি পুনরায় চালিত করার এবং stdout এবং stderr ( |&) উভয়কে একটি কমান্ড প্রতিস্থাপনে পাইপিংয়ের পদ্ধতিকে ছেড়ে দেয় । হিমাইলের উত্তর এটি অর্জন করে, তবে একটি উপাধিতে ব্যবহার করা যাবে না কারণ শেলটি আলিয়াস প্রসারিত করার আগে ইতিহাসের সম্প্রসারণ সম্পাদন করে, পরে নয়।

শেল ফাংশনে কাজ করার জন্য আমি ইতিহাসের প্রসারণ পেতে পারি না, এমনকি এটির সাথে ফাংশনে সক্ষম করেও set -H। আমি !!কোনও ফাংশনে সন্দেহ করি যে কখনই প্রসারিত হবে না এবং আমি নিশ্চিত নই যে এটি হলে কী প্রসারিত হবে, তবে এখনই আমি নিশ্চিত না কেন এটি হয়নি।

অতএব, যদি আপনি জিনিসগুলি সেট আপ করতে চান যাতে আপনি খুব কম টাইপ করে এটি করতে পারেন তবে ইতিহাস থেকে শেষ কমান্ডটি বের করার জন্য আপনার ইতিহাসের প্রসারণের পরিবর্তে fcশেল বিল্টিন ব্যবহার করা উচিত । ইতিহাসের সম্প্রসারণ অক্ষম করা অবস্থায়ও এটির অতিরিক্ত সুবিধা রয়েছে যা এটি কার্যকর করে।

দেখানো হিসাবে গর্ডন Davisson এর উত্তর থেকে উপনাম ব্যাশ ইতিহাস সম্প্রসারণ ধারণকারী তৈরি করা হচ্ছে (চালু সুপার ইউজার ), $(fc -ln -1)অনুকরণ করে !!। এই প্লাগিং !!মধ্যে heemayl হুকুম $(!! |& tail -1) উৎপাদনের:

$($(fc -ln -1) |& tail -1)

এটি এর মতো কাজ করে $(!! |& tail -1)তবে একটি উপন্যাস সংজ্ঞাতে যেতে পারে:

alias @@='$($(fc -ln -1) |& tail -1)'

আপনি যে সংজ্ঞা চালান, বা এটা করা পরে .bash_aliasesবা .bashrcএবং একটি নতুন শেল শুরু, আপনি কেবল টাইপ করতে পারেন @@গত কমান্ডের ফলাফল শেষ লাইন চালানো প্রচেষ্টা (অথবা আপনি যা ওরফে নামে)।

ek@Io:~$ alias @@='$($(fc -ln -1) |& tail -1)'
ek@Io:~$ evolution
The program 'evolution' is currently not installed. You can install it by typing:
sudo apt-get install evolution
ek@Io:~$ @@
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  evolution-common evolution-data-server evolution-data-server-online-accounts
....

এটিকে আলাদা স্ক্রিপ্টে সরানোর কোনও বিকল্প আছে কি? আমি চেষ্টা করেছিলাম এবং শেষ পর্যন্ত ব্যর্থ হয়েছি, কারণ এফসি কিছুই খোলার বাইরে চলে যায় ... যেহেতু এফসি বর্তমান শেল সেশনের ইতিহাস অনুসরণ করে, তাই আলাদা স্ক্রিপ্টে স্থানান্তর করা খালি ইতিহাসের সাথে অবশ্যই সেখানে একটি আলাদা অধিবেশন খোলে, অবশ্যই ... আমি কয়েকটি যুক্ত করেছি স্ক্রিপ্টে এফসি লাইনের উপরে কমান্ড রয়েছে এবং তার মধ্যে একটি কার্যকর করা হয়েছিল। সুতরাং, আমি আশ্চর্য হয়েছি যে স্ক্রিপ্টটি বলার কোনও বিকল্প আছে কিনা, এটির "প্রসঙ্গ" বাশ সেশন যা এটি সম্পাদন করে। পছন্দ করুন, #! / বিন / বাশ বা কোনও কিছুর জন্য কিছু যুক্তি ...
Exterminator13

@ Exterminator13 আপনি যদি একটি পৃথক স্ক্রিপ্ট বোঝাতে চান - যা আপনি চালিত করেন - যেমন আপনি তৈরি করেননি বা বিল্টিনের সাহায্যে - তবে আমি নিশ্চিত ./scriptনই । শ্যাশ প্রস্থান করার সময় বা আপনি যখন চালিত হন বা (দেখুন ) কোনও ফাইলটিতে ব্যাশ যুক্ত হয় । যদি এটি হয়ে থাকে, তবে একাধিক ইন্টারেক্টিভ শেলের কমান্ডগুলি আন্তঃবিস্তারিত হবে (আপনি যে ক্রমটি চালিয়েছিলেন সেটিতে প্রদর্শিত হবে)। আপনি এটি অবিলম্বে সংযোজন করতে পারেন। । তবে আমি মনে করি একটি স্ক্রিপ্টে কাজ করার জন্য আরও অনেক কিছু করার আছে । আমি এই সম্পর্কে একটি নতুন প্রশ্ন পোস্ট করার পরামর্শ দিচ্ছি। যদি আপনি তা করেন তবে দয়া করে এখানে একটি লিঙ্ক সহ মন্তব্য করতে দ্বিধা বোধ করবেন। .sourcehistory-a-whelp historyfc
এলিয়াহ কাগন

2

আপনি যদি এক্স এর অধীনে টার্মিনাল এমুলেটর ব্যবহার করে থাকেন gnome-terminal, konsoleবা xterm, আপনি অনুলিপি এবং পেস্টের মতো কোনও কিছুর জন্য এক্স নির্বাচন ব্যবহার করতে পারেন:

প্রাথমিক নির্বাচনটি ব্যবহার করুন

ট্রিপল বাম ক্লিক দিয়ে চালানোর জন্য পুরো লাইনটি নির্বাচন করুন

তারপরে একটি মিডল বোতাম ক্লিক করে কমান্ড লাইনে এটি আটকান

এটি বেশিরভাগ টার্মিনাল এমুলেটরগুলিতে কাজ করা উচিত। ক্লিপবোর্ড স্পর্শ না করে এটি প্রাথমিক নির্বাচনটি ব্যবহার করে - এগুলি পৃথক।
এটি নির্বাচন করা হচ্ছে, এবং তারপরে প্রযুক্তিগতভাবে এক ক্রিয়াকলাপে অনুলিপি করুন এবং আটকান।


1
@ টিম এটি সত্য - আমি এটি পরিষ্কার করব।
ভোলকার সিগেল

1

এলিয়াহ কাগান যেমন উল্লেখ করেছেন , শেলটি কমান্ড আউটপুট সংরক্ষণ করে না। যাইহোক, আপনি যদি পর্দা চালান তবে আবার কমান্ডটি না চালিয়ে শেষ কমান্ডের শেষ লাইন আউটপুট পাওয়ার একটি উপায় রয়েছে ।

নিম্নলিখিত লাইন আপনার মধ্যে রাখুন ~/.screenrc:

register t "^a[k0y$ ^a]^a^L"
bind t process t

তারপরে আপনি বর্তমান প্রম্পটে পূর্ববর্তী লাইনটি সন্নিবেশ করতে Ctrl+ টিপতে পারেন at। এটি স্বয়ংক্রিয়ভাবে এন্টার টিপতেও এটি সম্ভব হবে তবে আপনি চালনার আগে এটি পরীক্ষা করা এবং ম্যানুয়ালি এন্টার টিপুন এটি সম্ভবত আরও ভাল ধারণা।

কিভাবে এটা কাজ করে:

  • register tনামের একটি বাফারে একটি স্ট্রিং নিবন্ধন করে t। স্ট্রিং নিম্নলিখিত একটি মূল ক্রম।
  • bind tকীটিতে আবদ্ধ t(অর্থাত্ Ctrl+ ব্যবহার করে চালানো at), process tঅর্থাত্ নামের বাফারের সামগ্রীটি মূল্যায়ন করুন t
  • ক্রম নিজেই অর্থ:
    • ^a[(= Ctrla[): অনুলিপি মোড লিখুন
    • kএক লাইন উপরে যান, লাইনের 0শুরুতে যান, লাইনের y$শেষ অবধি কপি করুন, (স্পেস) কমান্ডটি সম্পূর্ণ করুন complete
    • ^a](= Ctrla]): অনুলিপি করা সামগ্রী আটকে দিন
    • ^a^L(= CtrlaCtrlL) স্ক্রিনটি রিফ্রেশ করুন (অন্যথায় আটকানো সামগ্রী প্রদর্শিত হবে না, কারণ আপনি নিজেরাই টাইপ করেন নি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.