আমি কীভাবে একই পাইপে `সময়` আউটপুট এবং কমান্ড আউটপুটটিকে পুনর্নির্দেশ করতে পারি?


24

ধরুন আমার কাছে বাইনারি রয়েছে foo

আমি যদি fooঅন্য কোনও প্রক্রিয়াতে আউটপুট পুনর্নির্দেশ করতে চাই তবে আমি barলিখতে পারি ./foo | bar

অন্যদিকে, যদি আমি করতে চেয়েছিলেন timefoo বিন্যাস, এবং আউটপুট পুনর্নির্দেশ এর time, আমি লিখতে পারি time (./foo) | bar

আমার প্রশ্ন, আমি কীভাবে আউটপুটটির আউটপুটটি timeশেষ পাই fooএবং একই পাইপের মাধ্যমে পাইপ করব ?

নীচের সমাধানটি আমি যা খুঁজছি তা নয় , কারণ এটি প্রক্রিয়াটির দুটি পৃথক দৃষ্টান্ত শুরু করে bar, যখন আমি একটি একক ভাগ করা পাইপ চাই, এর একক উদাহরণে bar

time (./foo | bar)  | bar

যে কেউ আগ্রহী, তার জন্য দুটি উদাহরণ শুরু না করার কারণটি barহল barএকটি নেটওয়ার্ক ক্লায়েন্ট হতে পারে এবং আমি http POSTপ্রক্রিয়া আউটপুট হিসাবে একই বার্তার অংশ হিসাবে সময় সংক্রান্ত তথ্য সার্ভারে প্রেরণ করা চাই ।


এখানে উত্তর দেওয়া হয়েছে, কিছুটা আরও ভাল উত্তর: stackoverflow.com/questions/13356628/…
জেডিএস

উত্তর:


29

যদি আমি বুঝতে পারি যে আপনি যা চেয়েছেন আমি এটি করব। আমি কমান্ডগুলি ব্যবহার করছি ls ~এবং এর teeজন্য স্ট্যান্ড-ইন হিসাবে ./fooএবং barতবে আপনি যা চান তার সাধারণ ফর্মটি হ'ল:

$ ( time ./foo ) |& bar

দ্রষ্টব্য: এর আউটপুট timeইতিমধ্যে যে কোনও আউটপুট শেষে সংযুক্ত করা হচ্ছে ./foo, এটি কেবল এসটিডিআরআরে করা হচ্ছে। পাইপের মাধ্যমে এটিকে পুনর্নির্দেশ করতে আপনার STDOR এর সাথে STDERR একত্রিত করতে হবে। আপনি হয় |&বা এটি করতে ব্যবহার করতে পারেন 2>&1

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

উদাহরণ

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

এবং এখানে cmd.logউত্পাদিত ফাইলের বিষয়বস্তু এখানে tee

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

নোট করুন যে এই বাক্য গঠনটি BASH এর জন্য কাজ করে না।
jvriesem

1
@jvriesem সব উদাহরণ থেকে ব্যাশ হয়
SLM

9

timeডিফল্টরূপে স্টাডআউটের পরিবর্তে এর আউটপুটটি স্ট্ডারে প্রেরণ করে। আপনি যেখানে এটি চান সেখানে আপনাকে পুনঃনির্দেশ করা দরকার।

আপনি বলছেন "অন্যদিকে, আমি যদি timeফাঁকি দিতে চাই , এবং timeআমি লিখতে পারি তার আউটপুটটিকে পুনর্নির্দেশ করুন time (./foo) | bar।" তবে এটি আসলে ভুল। এই ক্ষেত্রে, সময়ের আউটপুটটি এখনও আপনার কনসোলে প্রদর্শিত হবে, কেবল স্টডআউট পুনঃনির্দেশিত হবে।

আপনি স্টাডারকে বিশেষভাবে এর সাথে পুনঃনির্দেশ করতে পারেন:

(time foo) 2>&1 | bar

বা সমস্ত পাইপ সহ:

(time foo) |& bar

এটি সঠিকভাবে কাজ করার জন্য বন্ধনীগুলির প্রয়োজন।


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