কীভাবে একাধিক কমান্ডে সময় চালানো যায় এবং ফাইলের জন্য টাইম আউটপুট লিখুন?


65

আমি timeকয়েকটি কমান্ডের সময় পরিমাপ করতে কমান্ড চালাতে চাই ।

আমি যা করতে চাই তা হ'ল:

  • তাদের একসাথে যোগ করা সমস্তগুলির চলমান সময় পরিমাপ করুন
  • timeএকটি ফাইল আউটপুট লিখুন
  • STDERRআমি যে আদেশটি পরিমাপ করছি তা থেকে লিখুনSTDERR

আমি কি না কি করতে চান হয়

  • একটি পৃথক স্ক্রিপ্টে বেশ কয়েকটি কমান্ড লিখুন (কেন? কারণ এগুলি ইতিমধ্যে একটি স্ক্রিপ্ট যা আমি প্রোগ্রামক্রমে তৈরি করছি এবং অন্য কোনও অস্থায়ী স্ক্রিপ্ট তৈরি করা আমার চেয়ে বেশি গোলমাল হবে)

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

/usr/bin/time --output=outtime -p echo "a"; echo "b";

কাজ করে না, timeপ্রথম প্রথমটিতে চালানো হয়।

/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )

কাজ করে না, (অপ্রত্যাশিত টোকেন।

/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }

কাজ করে না, "এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"।

/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'

কাজ করে না, "এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"।

time ( echo "a"; echo "b"; ) 2>outtime

কাজ করে না, যেহেতু এটি সমস্তগুলিকে পুনর্নির্দেশ STDERRকরে outtime; আমি কেবল সেখানে timeআউটপুট চাই ।

এবং অবশ্যই,

time --output=outime echo "a";

কাজ করে না, যেহেতু --output=outime: command not found

আমি এটা কিভাবে করবো?

উত্তর:


90

sh -c 'commands'কমান্ড হিসাবে ব্যবহার করুন , যেমন:

/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'

2
একটি সংক্ষিপ্ত সংস্করণ:time -p sh -c 'echo "a"; echo "b"'
জিও

7

এটা চেষ্টা কর:

% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput                                
( { echas z; echo 2; } 2>&3; )  0.00s user 0.00s system 0% cpu 0.004 total

ব্যাখ্যা:

প্রথমত, এর আউটপুট পুনর্নির্দেশ করার জন্য আমাদের একটি উপায় খুঁজতে হবে time। যেহেতু timeএকটি শেল অন্তর্নির্মিত, তাই এটি পুনর্নির্দেশগুলি সহ কমান্ড হিসাবে পরিমাপ করার জন্য সম্পূর্ণ কমান্ড লাইন নেয়। সুতরাং,

% time whatever 2>timeoutput
whatever 2> timeoutput  0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput 
zsh: command not found: whatever

[দ্রষ্টব্য: জানোসের মন্তব্যটি বোঝায় যে এটির ক্ষেত্রে এটি নয় bash]] আমরা একটি সাব-শেল timeচালিয়ে timeএবং তারপরে সেই সাবশেলের আউটপুট পুনর্নির্দেশের মাধ্যমে আউটপুটটির পুনর্নির্দেশটি অর্জন করতে পারি ।

% (time whatever) 2> timeoutput
% cat timeoutput 
zsh: command not found: whatever
whatever  0.00s user 0.00s system 0% cpu 0.018 total

এখন আমরা সফলভাবে আউটপুটটিকে পুনঃনির্দেশিত করেছি time, তবে এর আউটপুটটি আমরা যে কমান্ডটি পরিমাপ করছি তার ত্রুটি আউটপুটটির সাথে মিশে গেছে। দুটি পৃথক করার জন্য, আমরা একটি অতিরিক্ত ফাইল বর্ণনাকারী ব্যবহার করি।

আমাদের "বাইরের" উপর রয়েছে

% (time ... ) 3>&2 2>timeout

এর অর্থ: ফাইল ডেস্ক্রিপ্টর 3 তে যা কিছু লেখা আছে, একই জায়গায় আউটপুট হবে ফাইল বর্ণনাকারী 2 (স্ট্যান্ডার্ড ত্রুটি) এখন আউটপুট করছে (টার্মিনাল)। এবং তারপরে আমরা স্ট্যান্ডার্ড ত্রুটিটি ফাইলে পুনর্নির্দেশ করি timeout

সুতরাং এখন আমাদের আছে: stdout এবং এফডি 3 তে লেখা সমস্ত কিছুই টার্মিনালে চলে যাবে, এবং স্ট্ডারকে লেখা সমস্ত কিছুই ফাইলটিতে যাবে। যা অবশিষ্ট আছে তা হল পরিমাপ করা কমান্ডের স্টডারকে এফডি 3-এ পুনঃনির্দেশ করা।

% (time whatever 2>&3) 3>&2 2>timeout

এখন, একাধিক কমান্ডকে সময় পরিমাপ করার জন্য আমাদের এগুলি একটি (অন্যান্য!) সাবশেলের (প্রথম বন্ধনীতে) চালানো দরকার। এবং তাদের সকলের ত্রুটি আউটপুট এফডি 3 তে পুনর্নির্দেশ করতে আমাদের কোঁকড়ানো বন্ধনীগুলির মধ্যে তাদের গ্রুপ করতে হবে।

সুতরাং, অবশেষে, আমরা এখানে পৌঁছেছি:

% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput

এটাই.


এটি পসিক্স শেলের একটি সিনট্যাক্স ত্রুটি। সম্ভবত বাশিজম?
জোছ

@ জোছ এখানে ব্যবহৃত শেল zsh হয়।
অ্যাঙ্গাস

6

সঠিক উত্তর নয় তবে প্রশ্নের সাথে খুব সম্পর্কিত।
একাধিক প্রোগ্রামের সম্মিলিত প্রথম বন্ধনের জন্য সময়সাপেক্ষের পরিসংখ্যানগুলি প্রয়োজনীয়। সেমিকোলন দিয়ে পৃথক কমান্ড।

time ( command1 ; command2 )

1
এটা সুন্দর. আরও ভাল, কমান্ডের মধ্যে && ব্যবহার করুন - এরকম যাতে time ( command1 && command2 )প্রথম কমান্ড ব্যর্থ হয়; এটি অন্যকে কার্যকর করতে অগ্রসর হবে না।
বিকাশগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.