কীভাবে টাইম কমান্ডের আউটপুটটিকে লিনাক্সের কোনও ফাইলে পুনর্নির্দেশ করতে হয়?


202

লিনাক্সে টাইমিং প্রোগ্রামগুলি সম্পর্কে সামান্য প্রশ্ন: টাইম কমান্ড একটি প্রোগ্রামের সঞ্চালনের সময় পরিমাপ করতে দেয়:

[ed@lbox200 ~]$ time sleep 1

real    0m1.004s
user    0m0.000s
sys     0m0.004s

যা ভাল কাজ করে। তবে যদি আমি কোনও ফাইলে আউটপুট পুনর্নির্দেশের চেষ্টা করি তবে এটি ব্যর্থ হয়।

[ed@lbox200 ~]$ time sleep 1 > time.txt

real    0m1.004s
user    0m0.001s
sys     0m0.004s

[ed@lbox200 ~]$ cat time.txt 
[ed@lbox200 ~]$ 

আমি জানি একটি ফাইল লেখার বিকল্পের সাথে সময়ের অন্যান্য বাস্তবায়ন রয়েছে তবে আমার প্রশ্নটি সেই বিকল্পগুলি ছাড়াই কমান্ড সম্পর্কে।

কোনও পরামর্শ ?


3
বাশ স্ক্রিপ্টের সম্ভাব্য সদৃশ একটি ফাইলের সময় নির্বাহের সময় , এবং আমি নিশ্চিত যে এটি এই প্রথম এই জাতীয় প্রশ্ন।
— জোনাথন লেফলার

উত্তর:


266

চেষ্টা

{ time sleep 1 ; } 2> time.txt

যা "সময়" এর এসটিডিআরআর এবং আপনার কমান্ডকে সময়.txt এর সাথে সংযুক্ত করে

বা ব্যবহার

{ time sleep 1 2> sleep.stderr ; } 2> time.txt

যা "ঘুম" থেকে STDERR "স্লিপ.স্টেডার" ফাইলটিতে রাখে এবং "সময়" থেকে কেবল এসটিডিআরআর "টাইম.টিএসটিএসটি" এ চলে যায়


2
ধন্যবাদ, যে আমার প্রশ্নের অবিকল উত্তর দেয়। আমি যদি সঠিকভাবে বুঝতে পারি, টাইম কমান্ডের ফলাফল স্টডার থেকে পাওয়া যাবে?
— ed82

7
হ্যাঁ, তবে আপনাকে অবশ্যই এটি কোঁকড়া বন্ধনীতে রেখে দিতে হবে, অন্যথায় পুনর্নির্দেশটি কমান্ডের অংশ হবে যা timeমূল্যায়ন করে।
— জানুয়ারী

5
@ ড্যানিয়েল আপনি সর্বদা অভ্যন্তরীণ কমান্ড আউটপুটকে আলাদাভাবে পুনঃনির্দেশ করতে পারবেন (যেমন {টাইম স্লিপ 1 2> স্লিপস্টিডিআরটেক্সট;} 2> টাইম টেক্সট) এবং এটি আপনাকে কেবল সময়ের আউটপুট পেতে পারে। আমি নিশ্চিত না অন্যভাবে এটি স্বাধীনভাবে পাওয়ার কোনও উপায় আছে কিনা।
— gms7777

10
আপনি যদি গ্রেপ জাতীয় কিছু দিয়ে সময় ব্যবহার করতে চান যা স্টাডাউট চেষ্টা বন্ধ করে দেয় { time sleep 1; } 2>&1 | grep real। এটি স্টাডারকে স্টাডাউটে প্রেরণ করে যা গ্রেপটি তখন পড়তে পারে।
— क्লেটিজার্মেকে 1

9
'' 'ভুলো না চরিত্রটি '}' বন্ধ করার আগে, এটি ছাড়া কাজ করবে না (আমি করলাম, এবং ... কারণ কেন কাজ করছে না :))
— THESorcerer

38

মোড়ানো timeএবং কমান্ডটি আপনি বন্ধনীগুলির একটি সেটে সময় নির্ধারণ করছেন।

উদাহরণস্বরূপ, নিম্নলিখিত বার lsএবং lsফলাফল এবং সময় ফলাফল ফলাফল লিখেছে outfile:

$ (time ls) > outfile 2>&1

বা, আপনি যদি কমান্ডের আউটপুটটিকে ক্যাপচার আউটপুট থেকে আলাদা করতে চান time:

$ (time ls) > ls_results 2> time_results

12
এখানে একটি সাব-শেল চালু করা অপ্রয়োজনীয়।
— জানুয়ারী

1
@ সাম্পসন-চেন এটি কেবলমাত্র কাজ করে কারণ ls স্ট্যাডারকে কিছু লিখেন না? কমান্ডটি stdout এবং stderr উভয়কে লিখলে আপনি কীভাবে 'সময়' আউটপুটটি "কমান্ড" চালনা করবেন তা চালানো হবে?
— ডেভিড ডরিয়া

36

সহজ। জিএনইউ timeইউটিলিটির জন্য এটির একটি বিকল্প রয়েছে।

তবে আপনাকে নিশ্চিত করতে হবে যে আপনি নিজের শেলের বিল্টিন কমান্ডটি ব্যবহার করছেন নাtime , অন্তত bashবিল্টিন সেই বিকল্পটি সরবরাহ করে না! এজন্য আপনাকে timeইউটিলিটির পুরো পথ দেওয়া দরকার :

/usr/bin/time -o time.txt sleep 1

: আপনি সম্পূর্ণ পাথ উল্লেখ না করে অ বিল্ট-ইন ব্যবহার করতে পারেন stackoverflow.com/questions/29540540/...
— সিরো Santilli郝海东冠状病六四事件法轮功

14

আপনি যদি কমান্ডের ত্রুটি আউটপুটটির বিষয়ে চিন্তা করেন তবে বিল্ট ইন টাইম কমান্ডটি ব্যবহার করার সময় আপনি এগুলি আলাদা করতে পারেন।

{ time your_command 2> command.err ; } 2> time.log

অথবা

{ time your_command 2>1 ; } 2> time.log

আপনি দেখতে পাবেন যে কমান্ডের ত্রুটিগুলি কোনও ফাইলে যায় (যেহেতু এর stderrজন্য ব্যবহৃত হয় time)।

দুর্ভাগ্যক্রমে আপনি এটিকে অন্য হ্যান্ডেলে (পছন্দ মতো 3>&2) প্রেরণ করতে পারবেন না কারণ এটির বাইরে আর কোনও অস্তিত্ব থাকবে না{...}

এটি বলেছিল, আপনি যদি জিএনইউ সময় ব্যবহার করতে পারেন তবে @ টিম লুডউইনস্কি যা বলেছিলেন তা করুন do

\time -o time.log command

8

যেহেতু 'টাইম' কমান্ডের আউটপুট ত্রুটি আউটপুট, তাই স্ট্যান্ডার্ড আউটপুটটিকে পুনর্নির্দেশ করা হবে কারণ আরও প্রক্রিয়াজাতকরণ করা আরও স্বজ্ঞাত হবে।

{ time sleep 1; } 2>&1 |  cat > time.txt

6

যদি আপনি অন্তর্নির্মিত ব্যাশের পরিবর্তে জিএনইউ সময় ব্যবহার করেন তবে চেষ্টা করুন

time -o outfile command

(দ্রষ্টব্য: জিএনইউ সময় বিন্যাস অন্তর্নির্মিতের চেয়ে কিছুটা আলাদাভাবে ফর্ম্যাট করে)।


1
এই, আপনাকে ধন্যবাদ। এবং আপনি \time -o outfile commandঅন্তর্নির্মিত পরিবর্তে GNU ব্যবহারের জন্য (`` সহ) ব্যবহার করতে পারেন
— চিহ্নিত করুন

3
&>out time command >/dev/null

তোমার ক্ষেত্রে

&>out time sleep 1 >/dev/null

তারপর

cat out

3
মার্জিত ধারণা, তবে শেলটি তার অন্তর্নির্মিত কমান্ডটি ব্যবহার না করে নিয়ে যায়। আপনার যদি সত্যিকারের timeবাইনারি ইনস্টল না outথাকে তবে এর মতো কিছু থাকবে bash: time: command not found।
— scy

এছাড়াও জিএনইউ সময়ের জন্য ফর্ম্যাটটি ব্যাশ বিল্টিনের মতো নয়, যা স্বয়ংক্রিয়ভাবে পার্সিংয়ের জন্য সমস্যা তৈরি করে।
— গাস করুন

3

আমি ব্যবহার করে শেষ করেছি:

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
  • যেখানে "ক" যুক্ত হয়
  • যেখানে "o" ফাইলের নামের সাথে যুক্ত হওয়ার জন্য এগিয়ে যায়
  • যেখানে "এফ" প্রিন্টফ-এর মতো সিনট্যাক্স সহ ফর্ম্যাট
  • যেখানে "% E" 0:00:00 উত্পাদন করে; সময়: মিনিট: সেকেন্ড
  • আমাকে / ইউএসআর / বিন / সময় প্রার্থনা করতে হয়েছিল কারণ বাশ "সময়" এটি পদদলিত করে চলেছে এবং একই বিকল্প নেই
  • আমি কেবল ফাইলের আউটপুট পাওয়ার চেষ্টা করছিলাম, ওপির মতো নয়

2
#!/bin/bash

set -e

_onexit() {
    [[ $TMPD ]] && rm -rf "$TMPD"
}

TMPD="$(mktemp -d)"
trap _onexit EXIT

_time_2() {
    "$@" 2>&3
}

_time_1() {
    time _time_2 "$@"
}

_time() {
    declare time_label="$1"
    shift
    exec 3>&2
    _time_1 "$@" 2>"$TMPD/timing.$time_label"
    echo "time[$time_label]"
    cat "$TMPD/timing.$time_label"
}

_time a _do_something
_time b _do_another_thing
_time c _finish_up

এটি সাব শেলগুলি না ছড়িয়ে দেওয়ার সুবিধা অর্জন করে এবং চূড়ান্ত পাইপলাইনটিতে এটি স্ট্যাডারকে আসল স্ট্যাডারটিতে পুনরুদ্ধার করা হয়।


0

আপনি যদি মূল প্রক্রিয়াটির স্টাডাউট এবং স্ট্ডার স্পর্শ করতে না চান তবে আপনি স্ট্যাডারকে বিবরণী 3 এবং পিছনে ফাইলটিতে পুনঃনির্দেশ করতে পারেন:

$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out

real    0m0.009s
user    0m0.004s
sys     0m0.000s

রানটাইমের নিরীক্ষণের জন্য আপনি এটি একটি মোড়কের জন্য (যেমন ক্রোনজবসের জন্য) ব্যবহার করতে পারেন:

#!/bin/bash

echo "[$(date)]" "$@" >> /my/runtime.log

{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log

0

আপনি যদি ব্যবহার করেন তবে আপনি এটি ব্যবহার cshকরতে পারেন:

/usr/bin/time --output=outfile -p $SHELL  -c 'your command'

উদাহরণ স্বরূপ:

/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.