বাশ ব্যবহার করে স্বয়ংক্রিয়ভাবে শেষ কমান্ডের আউটপুট কে পরিবর্তনশীল হিসাবে ক্যাপচার করে?


139

আমি পরবর্তী কমান্ডে শেষ সম্পাদিত কমান্ডের ফলাফলটি ব্যবহার করতে সক্ষম হতে চাই। উদাহরণ স্বরূপ,

$ find . -name foo.txt
./home/user/some/directory/foo.txt

এখন আসুন আমি বলি যে আমি কোনও সম্পাদকের মধ্যে ফাইলটি খুলতে, বা এটি মুছতে, বা এটির সাথে অন্য কিছু করতে সক্ষম হতে চাই eg

mv <some-variable-that-contains-the-result> /some/new/location

আমি এটা কিভাবে করবো? হয়তো কিছু ব্যাশ ভেরিয়েবল ব্যবহার করছেন?

হালনাগাদ:

স্পষ্ট করতে, আমি ম্যানুয়ালি জিনিস বরাদ্দ করতে চাই না। আমি যা করছি তা বিল্ট-ইন ব্যাশ ভেরিয়েবলগুলির মতো কিছু is

ls /tmp
cd $_

$_পূর্ববর্তী কমান্ডের শেষ যুক্তিটি ধারণ করে। আমি অনুরূপ কিছু চাই, তবে শেষ কমান্ডের ফলাফল দিয়ে।

চূড়ান্ত আপডেট:

শেঠের উত্তর বেশ ভাল কাজ করেছে। মনে রাখতে হবে কয়েকটি জিনিস:

  • touch /tmp/xপ্রথম বার সমাধানের চেষ্টা করার সময় ভুলবেন না
  • শেষ কমান্ডের প্রস্থান কোডটি সফল হলে ফলাফল কেবলমাত্র সংরক্ষণ করা হবে

আপনার সম্পাদনা দেখার পরে আমি আমার উত্তর মুছে ফেলতে ভেবেছিলাম। আমি ভাবছি যে বিল্ট-ইন এমন কিছু আছে যা আপনি সন্ধান করছেন।
টাস্কিনুর

আমি অন্তর্নির্মিত কিছুই খুঁজে পাইনি। আমি ভাবছিলাম যে এটি বাস্তবায়ন করা সম্ভব হবে কিনা .. সম্ভবত .bsrc এর মাধ্যমে? আমি মনে করি এটি একটি দুর্দান্ত সুবিধাজনক বৈশিষ্ট্য হবে।
আরমান্ডিনো

আমি আশঙ্কা করছি আপনি যা করতে পারেন তা হ'ল হয় আউটপুটটিকে ফাইল বা পাইপে পুনর্নির্দেশ করা বা এটি ক্যাপচার করা, অন্যথায় এটি সংরক্ষণ করা হবে না।
বান্দি

3
শেল এবং টার্মিনালের সহযোগিতা ব্যতীত আপনি এটি করতে পারবেন না এবং তারা সাধারণত সহযোগিতা করে না। আরও দেখুন আমি কম্যান্ড লাইন থেকে গত আউটপুট কিভাবে পুনরায় ব্যবহার করবেন? এবং পূর্ববর্তী কমান্ড 'আউটপুট থেকে টেক্সট ব্যবহার করে উপর ইউনিক্স স্ট্যাক এক্সচেঞ্জ
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

6
কমান্ডের আউটপুট ক্যাপচার না হওয়ার অন্যতম প্রধান কারণ হ'ল আউটপুট নির্বিচারে বড় হতে পারে - একসাথে অনেকগুলি মেগাবাইট। মঞ্জুর, সর্বদা এটি বড় নয়, তবে বড় ফলাফলগুলি সমস্যার সৃষ্টি করে।
জোনাথন লেফলার 26'11

উত্তর:


71

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

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


এটিই বলা হচ্ছে, এখানে "সমাধান" রয়েছে:

PROMPT_COMMAND='LAST="`cat /tmp/x`"; exec >/dev/tty; exec > >(tee /tmp/x)'

এই বাশ পরিবেশগত পরিবর্তনশীল সেট করুন এবং কমান্ডগুলি পছন্দসই হিসাবে ইস্যু করুন। $LASTআপনি যে আউটপুটটি সন্ধান করছেন তা সাধারণত থাকবে:

startide seth> fortune
Courtship to marriage, as a very witty prologue to a very dull play.
                -- William Congreve
startide seth> echo "$LAST"
Courtship to marriage, as a very witty prologue to a very dull play.
                -- William Congreve

1
@ আরমান্ডিনো: এটি অবশ্যই স্ট্যান্ডার্ড-আউটতে একটি টার্মিনালের সাথে আলাপচারিত হওয়ার প্রত্যাশার মতো কাজ করবে না (আরও / কম) বা বেআইনী জিনিসগুলি $ শেষ (ইম্যাকস) এ সঞ্চয় করবে না। তবে আমি মনে করি এটি আপনি যেমন পাবেন তেমনই ভাল। কেবলমাত্র অন্য বিকল্পটি হ'ল (টাইপ) স্ক্রিপ্টটি কোনও ফাইলের সমস্ত কিছুর একটি অনুলিপি সংরক্ষণ করতে এবং তারপরে সর্বশেষ PROMPT_COMMAND থেকে পরিবর্তনগুলি পরীক্ষা করার জন্য PROMPT_COMMAND ব্যবহার করুন। যদিও এটি আপনি চান না এমন জিনিসগুলি অন্তর্ভুক্ত করবে। আমি নিশ্চিত যে আপনি এটি যা চান তার কাছাকাছি কিছু খুঁজে পাচ্ছেন না।
শেঠ রবার্টসন

2
একটি সামান্য বিট আরো যেতে করার জন্য: PROMPT_COMMAND='last="$(cat /tmp/last)";lasterr="$(cat /tmp/lasterr)"; exec >/dev/tty; exec > >(tee /tmp/last); exec 2>/dev/tty; exec 2> >(tee /tmp/lasterr)'যা প্রদান করে উভয় $lastএবং $lasterr
hফিংক

@ সিডোসোবার: ম্যান ডিফল্টরূপে পেজারের মাধ্যমে আউটপুট প্রেরণ করে। যেমনটি আমার পূর্ববর্তী মন্তব্যটি বলেছিল: "প্রোগ্রামগুলি প্রত্যাশা অনুযায়ী (আরও / কম) কাজ না করার জন্য স্ট্যান্ডার্ড-আউটতে একটি টার্মিনালের সাথে ইন্টারেক্ট করার প্রত্যাশা করে"। আরও কম কম পেজার হয়।
শেঠ রবার্টসন

আমি পেয়েছি:No such file or directory
ফ্রান্সিসকো

@ রাফিংক আমি কেবল একটি সংশোধন তুলে ধরতে চেয়েছিলাম: আপনার পরামর্শটি শেষ হওয়া উচিত 2> >(tee /tmp/lasterr 1>&2)কারণ মানক আউটপুট teeঅবশ্যই স্ট্যান্ডার্ড ত্রুটিতে ফিরে যেতে হবে back
হিউজ

90

আমি কোনও পরিবর্তনশীল জানি না যা এটি স্বয়ংক্রিয়ভাবে করে । ফলাফলটিকে কেবল অনুলিপি-কাটা থেকে দূরে রেখে কিছু করা, আপনি যা কিছু করেছেন তা পুনরায় চালাতে পারেন, যেমন

vim $(!!)

!!ইতিহাসের প্রসারণ যেখানে 'পূর্ববর্তী আদেশ' এর অর্থ meaning

আপনি যদি স্পেস বা অন্য অক্ষরগুলির সাথে একটি একক ফাইলের নাম থাকতে পারেন যা সঠিক যুক্তি পার্সিং রোধ করতে পারে তবে ফলাফলটি উদ্ধৃত করুন ( vim "$(!!)")। এটিকে অব্যক্ত রেখে যাওয়া একাধিক ফাইল ততক্ষণে খোলার অনুমতি দেবে যতক্ষণ না সেগুলিতে স্পেস বা অন্যান্য শেল পার্সিং টোকেন অন্তর্ভুক্ত থাকে।


1
অনুলিপি-আটকানো হ'ল আমি সাধারণত এমন ক্ষেত্রে যা করি তা হ'ল কারণ আপনার সাধারণত কমান্ডের আউটপুটটির একটি অংশ প্রয়োজন। আমি অবাক হয়েছি আপনি এর প্রথম উল্লেখ করেছেন।
ব্রুনো ডি ফ্রেইন

4
আপনি কম কীস্ট্রোকের সাহায্যে আরও অনেক কিছু করতে পারেন:vim `!!`
স্মারক

গৃহীত উত্তর থেকে পার্থক্যটি দেখতে এক্সিকিউট করুন date "+%N"এবং তারপরেecho $(!!)
মেরিনোস আন

20

বাশ এক ধরনের কুৎসিত ভাষা। হ্যাঁ, আপনি আউটপুটটি ভেরিয়েবলকে বরাদ্দ করতে পারেন

MY_VAR="$(find -name foo.txt)"
echo "$MY_VAR"

তবে আরও ভাল আশা করুন যে আপনার findফলাফলটি কেবলমাত্র একটি ফলাফল ফিরে পেয়েছে এবং সেই ফলাফলটিতে কোনও "বিজোড়" অক্ষর নেই, যেমন গাড়ীর রিটার্ন বা লাইন ফিডগুলি যেমন বাশ ভেরিয়েবলের জন্য নির্ধারিত হলে নিঃশব্দে সংশোধন করা হবে।

তবে আপনার ভেরিয়েবলটি ব্যবহার করার সময় সঠিকভাবে উদ্ধৃতি দেওয়ার ক্ষেত্রে সতর্কতা অবলম্বন করুন!

এটি সরাসরি ফাইল কাজ করার জন্য, সঙ্গে যেমন ভালো find'র -execdir(সঙ্গে পরামর্শ ম্যানুয়াল)।

find -name foo.txt -execdir vim '{}' ';'

অথবা

find -name foo.txt -execdir rename 's/\.txt$/.xml/' '{}' ';'

5
আপনি নিয়োগের সময় এগুলি নিঃশব্দে সংশোধিত হয় না , আপনি প্রতিধ্বনিত হওয়ার পরে এগুলি সংশোধন করা হয় ! এটি কেবল echo "${MY_VAR}"দেখার জন্য আপনাকে করতে হবে।
প্যাক্সিডিয়াবল

13

এটি করার একাধিক উপায় রয়েছে। একটি উপায় হ'ল ব্যবহার করা v=$(command)যা কমান্ডের আউটপুট বরাদ্দ করবে v। উদাহরণ স্বরূপ:

v=$(date)
echo $v

এবং আপনি ব্যাককোটগুলিও ব্যবহার করতে পারেন।

v=`date`
echo $v

থেকে ব্যাশ শিক্ষানবিশদের গাইড ,

পুরনো-স্টাইলের ব্যাককোয়েটেড ফর্মটি প্রতিস্থাপনের সময় ব্যবহৃত হয়, ব্যাকস্ল্যাশ "$", "` ", বা" \ "অনুসরণ না করে তার আক্ষরিক অর্থ ধরে রাখে। ব্যাকস্ল্যাশের আগে না হওয়া প্রথম ব্যাকটিকগুলি কমান্ডের বিকল্পটি শেষ করে। "$ (COMMAND)" ফর্মটি ব্যবহার করার সময়, প্রথম বন্ধনীগুলির মধ্যে সমস্ত অক্ষর কমান্ডটি তৈরি করে; কারও সাথেই বিশেষ চিকিত্সা করা হয় না।

সম্পাদনা: প্রশ্নে সম্পাদনার পরে, মনে হচ্ছে এটি ওপি খুঁজছেন এমন জিনিস নয়। যতদূর আমি জানি, $_শেষ কমান্ডের আউটপুট করার মতো বিশেষ ভেরিয়েবল নেই is


11

এটা বেশ সহজ। ব্যাক-কোট ব্যবহার করুন:

var=`find . -name foo.txt`

এবং তারপরে আপনি ভবিষ্যতে যে কোনও সময় এটি ব্যবহার করতে পারেন

echo $var
mv $var /somewhere

11

Disclamers:

  • এই উত্তরটি অর্ধ বছরের শেষের দিকে: ডি
  • আমি একটি ভারী tmux ব্যবহারকারী
  • এটি কাজ করার জন্য আপনাকে নিজের শেল টিএমউকে চালাতে হবে

Tmux এ একটি ইন্টারেক্টিভ শেল চালানোর সময়, আপনি সহজেই টার্মিনালে প্রদর্শিত ডেটা সহজেই অ্যাক্সেস করতে পারবেন। আসুন কয়েকটি আকর্ষণীয় আদেশ দেখুন:

  • tmux ক্যাপচার-ফলক : এটি এক প্রদর্শিত tmux এর অভ্যন্তরীণ বাফার ডেটা অনুলিপি করে। এটি বর্তমানে দৃশ্যমান নয় এমন ইতিহাসটি অনুলিপি করতে পারে তবে আমরা এখন সে বিষয়ে আগ্রহী নই
  • tmux তালিকা-বাফারস : এটি ক্যাপচারযুক্ত বাফারগুলির তথ্য প্রদর্শন করে। নতুনটির মধ্যে 0 নম্বর থাকবে।
  • tmux show-বাফার-বি (বাফার নাম্বার) : এটি প্রদত্ত বাফারের সামগ্রীগুলি টার্মিনালে মুদ্রণ করে
  • tmux পেস্ট-বাফার-বি (বাফার নাম্বার) : এটি প্রদত্ত বাফারের সামগ্রীগুলিকে ইনপুট হিসাবে আটকায়

হ্যাঁ, এটি আমাদের এখন অনেকগুলি সম্ভাবনা দেয় :) আমার হিসাবে, আমি একটি সাধারণ উপন্যাস সেটআপ করেছি: alias L="tmux capture-pane; tmux showb -b 0 | tail -n 3 | head -n 1"এবং এখন প্রতিবার যখন আমার শেষ লাইনটি অ্যাক্সেস করা দরকার তখন আমি $(L)এটি পেতে ব্যবহার করি।

এটি আউটপুট স্ট্রিমের থেকে পৃথক যা প্রোগ্রামটি ব্যবহার করে (এটি স্টিডিন বা স্টডার হতে পারে), মুদ্রণ পদ্ধতি (এনক্র্রেস ইত্যাদি) এবং প্রোগ্রামটির প্রস্থান কোড - কেবলমাত্র ডেটা প্রদর্শন করা দরকার।


আরে, এই tmux টিপ জন্য ধন্যবাদ। আমি মূলত ওপি হিসাবে একই জিনিসটির সন্ধান করছিলাম, আপনার মন্তব্যটি পেয়েছি এবং একটি শেল স্ক্রিপ্ট কোড করেছিলাম যাতে
বিল

9

আমি মনে করি আপনি কোনও সমাধানটি হ্যাক করতে সক্ষম হবেন যা এতে অন্তর্ভুক্ত কোনও স্ক্রিপ্টে আপনার শেল সেট করা জড়িত:

#!/bin/sh
bash | tee /var/log/bash.out.log

তারপরে আপনি যদি $PROMPT_COMMANDকোনও ডিলিমিটার আউটপুট সেট করে থাকেন তবে আপনি কোনও সহায়ক ফাংশন (সম্ভবত ডাকা যেতে পারেন) লিখতে পারেন _যা আপনাকে সেই লগের শেষ অংশ হিসাবে নিয়ে যায়, তাই আপনি এটি ব্যবহার করতে পারেন:

% find lots*of*files
...
% echo "$(_)"
... # same output, but doesn't run the command again

7

আপনি আপনার ব্যাশ প্রোফাইলে নিম্নলিখিত উপন্যাসটি সেট আপ করতে পারেন:

alias s='it=$($(history | tail -2 | head -1 | cut -d" " -f4-))'

তারপরে, একটি স্বেচ্ছাসৈনিক কমান্ডের পরে 's' টাইপ করে আপনি ফলাফলটি শেল ভেরিয়েবল 'এটি' তে সংরক্ষণ করতে পারেন।

সুতরাং উদাহরণস্বরূপ ব্যবহার হবে:

$ which python
/usr/bin/python
$ s
$ file $it
/usr/bin/python: symbolic link to `python2.6'

ধন্যবাদ! আমার grabফাংশনটি বাস্তবায়নের জন্য আমার এটি দরকার ছিল যা শেষ কমান্ড থেকে ক্লিপবোর্ডে নস্টম
davidhq

6

আমি bashএখানে পরামর্শগুলি থেকে এই ফাংশনটি নিঃশেষিত করেছি :

grab() {     
  grab=$("$@")
  echo $grab
}

তারপরে, আপনি কেবল করুন:

> grab date
Do 16. Feb 13:05:04 CET 2012
> echo $grab
Do 16. Feb 13:05:04 CET 2012

আপডেট : একজন অনামী ব্যবহারকারী প্রতিস্থাপনের জন্য প্রস্তাবিত যার echoদ্বারা printf '%s\n'এটির সুবিধা রয়েছে যে এটি -eহ'ল পাঠ্যের মতো বিকল্পগুলি প্রক্রিয়া করে না । সুতরাং, আপনি যদি এই জাতীয় বিশেষত্ব আশা করেন বা অনুভব করেন তবে এই পরামর্শটি বিবেচনা করুন। cat <<<$grabপরিবর্তে অন্য বিকল্প ব্যবহার করা হয়।


1
ঠিক আছে, কঠোরভাবে বলা এটি কোনও উত্তর নয় কারণ, "স্বয়ংক্রিয়" অংশটি পুরোপুরি অনুপস্থিত।
টিলম্যান ভোগেল

আপনি cat <<<$grabবিকল্প ব্যাখ্যা করতে পারেন ?
লিওজ

1
এর থেকে উদ্ধৃতি দিয়ে man bash: "এখানে স্ট্রিংস: এখানে নথিগুলির একটি বৈকল্পিক, ফর্ম্যাটটি হ'ল: <<<wordশব্দটি প্রসারিত করা হয় এবং এর মানক ইনপুটটিতে কমান্ড সরবরাহ করা হয়।" সুতরাং, এর মান স্টিডিনে $grabখাওয়ানো হয় cat, এবং catএটি কেবল স্টাডাউটে ফিড করে।
তিলম্যান ভোগেল

5

"আমি পরবর্তী কমান্ডে সর্বশেষ নির্বাহিত কমান্ডের ফলাফলটি ব্যবহার করতে সক্ষম হতে চাই" বলে আমি ধরে নিয়েছি - আপনি কেবল কোনও সন্ধানের জন্য নয়, কোনও আদেশের ফলাফল বলতে চাইছেন।

যদি মামলাটি না হয় - xargs হ'ল আপনি যা সন্ধান করছেন।

find . -name foo.txt -print0 | xargs -0 -I{} mv {} /some/new/location/{}

বা যদি আপনি প্রথমে আউটপুটটি দেখতে আগ্রহী হন:

find . -name foo.txt -print0

!! | xargs -0 -I{} mv {} /some/new/location/{}

এই কমান্ডটি একাধিক ফাইলের সাথে ডিল করে এবং পথ এবং / অথবা ফাইল নামটিতে স্থান (গুলি) থাকলেও একটি কবজির মতো কাজ করে।

লক্ষ্য করুন এমভি {} / কিছু / নতুন / অবস্থান / {} কমান্ড অংশ। এই কমান্ডটি পূর্ববর্তী কমান্ড দ্বারা মুদ্রিত প্রতিটি লাইনের জন্য বিল্ড এবং সম্পাদন করা হয়। এখানে পূর্ববর্তী কমান্ড দ্বারা মুদ্রিত রেখাটি {} এর স্থলে প্রতিস্থাপন করা হবে ।

Xargs এর ম্যান পৃষ্ঠা থেকে উদ্ধৃতি:

xargs - স্ট্যান্ডার্ড ইনপুট থেকে কমান্ড লাইনগুলি তৈরি এবং সম্পাদন করে

আরও তথ্যের জন্য ম্যান পৃষ্ঠা দেখুন: man xargs


5

ব্যাকটিক্স দিয়ে আউটপুট ক্যাপচার:

output=`program arguments`
echo $output
emacs $output

4

অ্যাসাইনমেন্ট ব্যতীত আমি এখানে অন্যরা যা পরামর্শ দেয় তা আমি সাধারণত করি:

$find . -iname '*.cpp' -print
./foo.cpp
./bar.cpp
$vi `!!`
2 files to edit

আপনি চাইলে ফ্যানসিয়ার পেতে পারেন:

$grep -R "some variable" * | grep -v tags
./foo/bar/xxx
./bar/foo/yyy
$vi `!!`

2

আপনি যা চান তা হ'ল যদি আপনার শেষ কমান্ডটি পুনরায় চালু করা এবং আউটপুট পাওয়া যায় তবে একটি সাধারণ ব্যাশ ভেরিয়েবল কাজ করবে:

LAST=`!!`

সুতরাং আপনি আউটপুটে আপনার কমান্ডটি এর সাথে চালাতে পারেন:

yourCommand $LAST

এটি একটি নতুন প্রক্রিয়া তৈরি করবে এবং আপনার আদেশটি পুনরায় চালু করবে, তারপরে আপনাকে আউটপুট দেবে। মনে হচ্ছে আপনি যা চান তা কমান্ড আউটপুটের জন্য বাশ ইতিহাস ফাইল হবে history এর অর্থ ব্যাশ আপনার টার্মিনালে প্রেরণ করে এমন আউটপুট ক্যাপচার করতে হবে। আপনি / দেব বা / প্রোকার দেখার জন্য কিছু লিখতে পারেন তবে এটি অগোছালো। আপনি আপনার টার্ম এবং ব্যাশের মাঝখানে একটি টি কমান্ড দিয়ে কেবল "বিশেষ পাইপ" তৈরি করতে পারেন যা আপনার আউটপুট ফাইলে পুনঃনির্দেশ করে।

তবে এগুলি উভয়ই হ্যাকি সমাধানের ধরণের। আমি মনে করি সেরা জিনিসটি টার্মিনেটর হবে যা আউটপুট লগিংয়ের সাথে আরও আধুনিক টার্মিনাল। শেষ কমান্ডের ফলাফলের জন্য কেবল আপনার লগ ফাইলটি পরীক্ষা করুন। উপরের মত একটি ব্যাশ ভেরিয়েবল এটি আরও সহজ করে তুলবে।


1

আপনার আদেশটি কার্যকর করার পরে এটি করার একটি উপায় এখানে আপনি স্থির করে ফলটি সংরক্ষণ করতে চান তা স্থির করে:

$ find . -name foo.txt
./home/user/some/directory/foo.txt
$ OUTPUT=`!!`
$ echo $OUTPUT
./home/user/some/directory/foo.txt
$ mv $OUTPUT somewhere/else/

অথবা যদি আপনি আগেই জানেন যে আপনি কোনও পরিবর্তনশীলের ফলাফল চান তবে আপনি ব্যাকটিক্স ব্যবহার করতে পারেন:

$ OUTPUT=`find . -name foo.txt`
$ echo $OUTPUT
./home/user/some/directory/foo.txt

1

বিদ্যমান উত্তরের বিকল্প হিসাবে: whileআপনার ফাইলের নামগুলিতে ফাঁকা স্থান থাকতে পারে তা ব্যবহার করুন :

find . -name foo.txt | while IFS= read -r var; do
  echo "$var"
done

আমি যেমন লিখেছি, পার্থক্যটি কেবলমাত্র তখনই প্রাসঙ্গিক যদি আপনার ফাইলের নাম ফাঁকা আশা করতে হয়।

এনবি: একমাত্র অন্তর্নির্মিত স্টাফ আউটপুট সম্পর্কে নয় শেষ কমান্ডের স্থিতি সম্পর্কে।


1

আপনি ব্যবহার করতে পারেন !!: 1। উদাহরণ:

~]$ ls *.~
class1.cpp~ class1.h~ main.cpp~ CMakeList.txt~ 

~]$ rm !!:1
rm class1.cpp~ class1.h~ main.cpp~ CMakeList.txt~ 


~]$ ls file_to_remove1 file_to_remove2
file_to_remove1 file_to_remove2

~]$ rm !!:1
rm file_to_remove1

~]$ rm !!:2
rm file_to_remove2

এই স্বরলিপিটি একটি আদেশ থেকে সংখ্যাযুক্ত যুক্তি ধরে রেখেছে : "$ {পরামিতি: অফসেট}" এর জন্য ডকুমেন্টেশন এখানে দেখুন: gnu.org/software/bash/manual/html_node/… । আরও উদাহরণের জন্য এখানে দেখুন: howtogeek.com/howto/44997/…
আলেকজান্ডার বার্ড

1

আমার একইরকম প্রয়োজন ছিল, যার মধ্যে আমি শেষ কমান্ডের আউটপুটটি পরবর্তী একটিতে ব্যবহার করতে চেয়েছিলাম। অনেকটা এর মতো | (নল)। যেমন

$ which gradle 
/usr/bin/gradle
$ ls -alrt /usr/bin/gradle

যেমন কিছু -

$ which gradle |: ls -altr {}

সমাধান: এই কাস্টম পাইপটি তৈরি করেছে। এক্সার্গস ব্যবহার করে সত্যই সহজ -

$ alias :='xargs -I{}'

মূলত xargs জন্য একটি ছোট হাত তৈরি করে কিছুই হয় না, এটি কবজ মত কাজ করে, এবং সত্যিই সহজ। আমি কেবল .bash_profile ফাইলে উপনামটি যুক্ত করব।


1

ফাইল বর্ণনাকারীর যাদু এবং lastpipeশেল বিকল্পটি ব্যবহার করে এটি করা যেতে পারে ।

এটি একটি স্ক্রিপ্ট দিয়ে করতে হবে - "লাস্টপাইপ" বিকল্পটি ইন্টারেক্টিভ মোডে কাজ করবে না।

এখানে আমি যে স্ক্রিপ্টটি পরীক্ষা করেছি তা এখানে:

$ cat shorttest.sh 
#!/bin/bash
shopt -s lastpipe

exit_tests() {
    EXITMSG="$(cat /proc/self/fd/0)"
}

ls /bloop 2>&1 | exit_tests

echo "My output is \"$EXITMSG\""


$ bash shorttest.sh 
My output is "ls: cannot access '/bloop': No such file or directory"

আমি এখানে যা করছি তা হ'ল:

  1. শেল বিকল্প নির্ধারণ shopt -s lastpipe। এটি ছাড়া এটি কাজ করবে না কারণ আপনি ফাইল বিবরণী হারিয়ে ফেলবেন।

  2. আমার স্টাডারও সাথে ধরা পড়েছে তা নিশ্চিত করে 2>&1

  3. কোনও ফাংশনে আউটপুটটি পাইপ করা যাতে স্টিডিন ফাইল বর্ণনাকারী উল্লেখ করা যায়।

  4. /proc/self/fd/0ফাইল বর্ণনাকারী, যা স্টিডিনের বিষয়বস্তু পেয়ে ভেরিয়েবল নির্ধারণ ।

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

shopt -s lastpipe

exit_tests() {
    MYSTUFF="$(cat /proc/self/fd/0)"
    BADLINE=$BASH_LINENO
}

error_msg () {
    echo -e "$0: line $BADLINE\n\t $MYSTUFF"
    exit 1
}

ls /bloop 2>&1 | exit_tests ; [[ "${PIPESTATUS[0]}" == "0" ]] || error_msg

এইভাবে আমি 2>&1 | exit_tests ; [[ "${PIPESTATUS[0]}" == "0" ]] || error_msgযা যা পরীক্ষা করে দেখছি তার পিছনে আমি যুক্ত করতে পারি।

এখন আপনি আপনার আউটপুট উপভোগ করতে পারেন!


0

এটি কঠোরভাবে কোনও ব্যাশ সমাধান নয় তবে আপনি পূর্ববর্তী কমান্ডগুলির আউটপুটটির শেষ সারিটি পেতে সেডের সাথে পাইপিং ব্যবহার করতে পারেন।

"এ" ফোল্ডারে আমার কী আছে তা প্রথমে দেখতে দিন

rasjani@helruo-dhcp022206::~$ find a
a
a/foo
a/bar
a/bat
a/baz
rasjani@helruo-dhcp022206::~$ 

তারপরে, ls এবং cd সহ আপনার উদাহরণটি সেড & পাইপগুলিতে পরিণত হবে এমন কিছুতে:

rasjani@helruo-dhcp022206::~$ cd `find a |sed '$!d'`
rasjani@helruo-dhcp022206::~/a/baz$ pwd
/home/rasjani/a/baz
rasjani@helruo-dhcp022206::~/a/baz$

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


0

শেলটিতে পার্লের মতো বিশেষ চিহ্ন নেই যা শেষ কমান্ডের ইকো ফলাফল সংরক্ষণ করে।

আঁকাবাঁকা দিয়ে পাইপ প্রতীক ব্যবহার করতে শিখুন।

find . | awk '{ print "FILE:" $0 }'

উপরের উদাহরণে আপনি এটি করতে পারেন:

find . -name "foo.txt" | awk '{ print "mv "$0" ~/bar/" | "sh" }'

0
find . -name foo.txt 1> tmpfile && mv `cat tmpfile` /path/to/some/dir/

নোংরা সত্ত্বেও এটি অন্য একটি উপায়।


অনুসন্ধান . -নাম foo.txt 1> tmpfile &&vv বিড়াল tmpfile` পাথ / থেকে / কিছু / dir এবং&m আরএমপি tmpfile
কেভিন

0

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

এইটির সাথে সুবিধাটি হ'ল আপনাকে পুরো কমান্ডটি পুনরায় চালু করতে হবে না (যখন ব্যবহার করার সময় findবা অন্যান্য দীর্ঘ-চলমান কমান্ডগুলি যা জটিল হতে পারে)

যথেষ্ট সহজ, এটিকে এখানে পেস্ট করুন .bash_profile:

লিপি

# catch stdin, pipe it to stdout and save to a file
catch () { cat - | tee /tmp/catch.out}
# print whatever output was saved to a file
res () { cat /tmp/catch.out }

ব্যবহার

$ find . -name 'filename' | catch
/path/to/filename

$ res
/path/to/filename

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

এছাড়াও, আপনি যদি কোনও টেক্সট সম্পাদকে ফাইল আউটপুট খুলতে চান তবে আপনি এটি করতে পারেন:

# vim or whatever your favorite text editor is
$ vim <(res)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.