আমি শুধু টাইম কমান্ডের আউটপুট ক্যাপচার করতে চাই যেমন:
X=$(time ls)
অথবা
$(time ls) | grep real
সময় ফাংশন যদিও এটি কনসোলে স্পিট করে। আমি এটা কিভাবে করবো?
আমি শুধু টাইম কমান্ডের আউটপুট ক্যাপচার করতে চাই যেমন:
X=$(time ls)
অথবা
$(time ls) | grep real
সময় ফাংশন যদিও এটি কনসোলে স্পিট করে। আমি এটা কিভাবে করবো?
উত্তর:
দেখুন BashFAQ / 032 ।
$ # captures output of command and time
$ time=$( TIMEFORMAT="%R"; { time ls; } 2>&1 ) # note the curly braces
$ # captures the time only, passes stdout through
$ exec 3>&1 4>&2
$ time=$(TIMEFORMAT="%R"; { time ls 1>&3 2>&4; } 2>&1)
bar baz
$ exec 3>&- 4>&-
সময়টি "0.000" এর মতো দেখতে ব্যবহার TIMEFORMAT="%R"
করবে যা "আসল" সময় হবে।
exec
আমার উত্তরটিতে উপলব্ধ ফাইল বর্ণনাকারী ব্যবহার করে কমান্ড দ্বারা নির্মিত স্ট্রিম । যে কোনও উপলব্ধ ফাইল বিবরণকারী ব্যবহার করা যেতে পারে। 3 এবং 4 টি স্ট্রিম হ'ল যথাক্রমে 1 ( stdout
) এবং 2 ( stderr
) এর অনুলিপি । এটি আউটপুটটি 3 এবং 4 এ ls
স্বাভাবিকভাবে stdout
এবং এর stderr
মধ্য দিয়ে যেতে দেয় যখন আউটপুটটি time
(যা সাধারণত যায় stderr
) মূল stdout
(1) এ পুনঃনির্দেশিত হয় এবং তারপরে কমান্ড প্রতিস্থাপন ব্যবহার করে ভেরিয়েবলের ক্যাপচার হয়। আপনি যেমন আমার উদাহরণে দেখতে পাচ্ছেন, ফাইলের নামগুলি bar
এবং baz
টার্মিনালে আউটপুট। ...
-
।
সময় তার আউটপুটটি STDOUT এর চেয়ে STDERR এ লিখে দেয়। বিষয়টিকে আরও খারাপ করা, ডিফল্টরূপে 'সময়' একটি শেল বিল্টিন কমান্ড, সুতরাং যদি আপনি 'টাইম ls 2> & 1' '2> & 1' চেষ্টা করেন তবে কেবল 'ls' তে প্রযোজ্য।
সমাধান সম্ভবত কিছু হতে পারে:
/usr/bin/time -f 'real %e' -o OUTPUT_FILE ls > /dev/null 2>&1<br>
REALTIME=$(cat OUTPUT_FILE | cut -f 2 -d ' ')
এটি করার আরও অভিনব উপায় রয়েছে তবে এটি পরিষ্কার / সহজ উপায়।
@ ডেনিস উইলিয়ামসনের উত্তর দুর্দান্ত তবে এটি আপনাকে কমান্ডের আউটপুটকে একটি ভেরিয়েবল time
এবং অন্য ভেরিয়েবলের আউটপুট সংরক্ষণ করতে সহায়তা করে না । ফাইল বর্ণনাকারী ব্যবহার করে এটি আসলে সম্ভব নয়।
আপনি যদি কোনও প্রোগ্রাম চালাতে কত সময় নেয় তা রেকর্ড করতে চান, আপনি শেষ সময় থেকে শুরু করার সময়টি বিয়োগ করে এটি করতে পারেন। এখানে একটি সাধারণ উদাহরণ যা দেখায় যে কোনও প্রোগ্রামটি চালাতে কত মিলিসেকেন্ড নিয়েছিল:
START_TIME=$(date +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(date +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
এটি time
কমান্ডের মতো যথাযথ নয় , তবে বেশিরভাগ ব্যাশ স্ক্রিপ্টগুলির জন্য এটি পুরোপুরি সূক্ষ্মভাবে কাজ করা উচিত।
দুর্ভাগ্যক্রমে ম্যাকের date
আদেশটি %N
বিন্যাসটি সমর্থন করে না , তবে আপনি ইনস্টল করতে পারেন coreutils
( brew install coreutils
) এবং ব্যবহার করতে পারেন gdate
:
START_TIME=$(gdate +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(gdate +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
time
; ডেনিস উইলিয়ামসনের উত্তর সে ক্ষেত্রে আরও ভাল।