ইউনিক্সে টাইম কমান্ডের আউটপুটটিকে বাশকে ভেরিয়েবলে পুনঃনির্দেশ করুন?


13

আমি শুধু টাইম কমান্ডের আউটপুট ক্যাপচার করতে চাই যেমন:

X=$(time ls)

অথবা

$(time ls) | grep real

সময় ফাংশন যদিও এটি কনসোলে স্পিট করে। আমি এটা কিভাবে করবো?

উত্তর:


12

এক্স = `(সময় ls) 2> & 1 | গ্রেপ রিয়েল`


আপনার কেবল একটি সাবশেলের দরকার নেই time; ডেনিস উইলিয়ামসনের উত্তর সে ক্ষেত্রে আরও ভাল।
মুসিফিল

11

দেখুন 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"করবে যা "আসল" সময় হবে।


আপনি একটু ব্যাখ্যা করতে পারেন কিভাবে এটি কাজ করে? আমি কয়েক বছর ধরে এই কার্গো কাল্ট স্টাইলের মতো একটি স্নিপেট ব্যবহার করেছি। স্ট্রিম 3 এবং 4? এবং '-' ?
সাইরেক্স

1
@ সিরেক্স: 3 এবং 4 টি স্ট্রিমগুলি execআমার উত্তরটিতে উপলব্ধ ফাইল বর্ণনাকারী ব্যবহার করে কমান্ড দ্বারা নির্মিত স্ট্রিম । যে কোনও উপলব্ধ ফাইল বিবরণকারী ব্যবহার করা যেতে পারে। 3 এবং 4 টি স্ট্রিম হ'ল যথাক্রমে 1 ( stdout) এবং 2 ( stderr) এর অনুলিপি । এটি আউটপুটটি 3 এবং 4 এ lsস্বাভাবিকভাবে stdoutএবং এর stderrমধ্য দিয়ে যেতে দেয় যখন আউটপুটটি time(যা সাধারণত যায় stderr) মূল stdout(1) এ পুনঃনির্দেশিত হয় এবং তারপরে কমান্ড প্রতিস্থাপন ব্যবহার করে ভেরিয়েবলের ক্যাপচার হয়। আপনি যেমন আমার উদাহরণে দেখতে পাচ্ছেন, ফাইলের নামগুলি barএবং bazটার্মিনালে আউটপুট। ...
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে

1
... একবার শেষ হয়ে গেলে অতিরিক্ত স্ট্রিমগুলি ট্রেলিং ব্যবহার করে বন্ধ করা হবে -
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

4

সময় তার আউটপুটটি 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 ' ')

এটি করার আরও অভিনব উপায় রয়েছে তবে এটি পরিষ্কার / সহজ উপায়।


আমি -o ছাড়াই এটি করতে আগ্রহী। আপনি যে অভিনব পদ্ধতির কথা ভেবেছিলেন তা পোস্ট করতে পারেন :)?
ডেভিড ডরিয়া

0

@ ডেনিস উইলিয়ামসনের উত্তর দুর্দান্ত তবে এটি আপনাকে কমান্ডের আউটপুটকে একটি ভেরিয়েবল 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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.