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


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.