लिनक्स में किसी फाइल के टाइम कमांड के आउटपुट को रीडायरेक्ट कैसे करें?


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 ~]$ 

मुझे पता है कि फ़ाइल को लिखने के लिए विकल्प -o के साथ समय के अन्य कार्यान्वयन हैं लेकिन मेरा प्रश्न उन विकल्पों के बिना कमांड के बारे में है।

कोई सुझाव ?


3
बैश स्क्रिप्ट के संभावित डुप्लिकेट एक फ़ाइल में समय को निष्पादित करते हुए लिखते हैं , और मैं आश्वस्त हूं कि यह पहला ऐसा प्रश्न है।
जोनाथन लेफ़लर

जवाबों:


266

प्रयत्न

{ time sleep 1 ; } 2> time.txt

जो "समय" के STDERR और टाइम कमांड में आपकी कमांड को जोड़ती है

या उपयोग करें

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

जो "नींद" से STDERR को "sleep.stderr" फ़ाइल में डालता है और केवल "समय" से STDERR "time.txt" में चला जाता है


2
धन्यवाद, यह मेरे सवाल का सटीक जवाब देता है। यदि मुझे सही ढंग से समझा जाए, तो समय कमांड का परिणाम स्टादर से प्राप्त किया जा सकता है?
ed82

7
हां, लेकिन आपको इसे घुंघराले ब्रैकेट में रखना होगा, अन्यथा पुनर्निर्देशन उस कमांड का हिस्सा होगा जो timeमूल्यांकन करता है।
22

5
@ डैनियल आप हमेशा आंतरिक कमांड आउटपुट को अलग-अलग रीडायरेक्ट कर सकते हैं (यानी {time sleep 1 2> sleepStdErr.txt;} 2> time.txt) और इससे आपको केवल टाइम आउटपुट मिलेगा। मुझे यकीन नहीं है कि वहाँ एक रास्ता है अन्यथा इसे स्वतंत्र रूप से प्राप्त करने के लिए।
gms7777

10
अगर आप कुछ ऐसा करने के लिए समय का उपयोग करना चाहते हैं जैसे कि grep जो कि stdout try को पढ़ता है { time sleep 1; } 2>&1 | grep real। यह stderr को stdout में भेजता है जिसे grep फिर पढ़ सकता है।
क्लेज़र्मक 1

9
'' मत भूलना '}' को बंद करने से पहले, यह बिना काम नहीं करेगा (मैंने किया, और ... आश्चर्य है कि काम क्यों नहीं कर रहा है :))
THESorcerer

38

लपेटें timeऔर आदेश आप कोष्ठक के एक सेट में समय कर रहे हैं।

उदाहरण के लिए, निम्नलिखित समय lsऔर परिणाम lsऔर समय के परिणामों को लिखते हैं outfile:

$ (time ls) > outfile 2>&1

या, यदि आप कमांड के आउटपुट को कैप्चर किए गए आउटपुट से अलग करना चाहते हैं time:

$ (time ls) > ls_results 2> time_results

12
यहां एक उपधारा प्रस्तुत करना अनावश्यक है।
जनवरी

1
@ sampson-chen यह केवल इसलिए काम करता है क्योंकि ls stderr के लिए कुछ भी सही से नहीं लिखता है? यदि आप कमांड को स्टैडआउट और स्टेडर दोनों को लिखते हैं तो आप कमांड के 'टाइम' के आउटपुट को "अलग" कैसे करेंगे?
डेविड डोरिया

36

सरल। GNU timeउपयोगिता के लिए एक विकल्प है।

लेकिन आपको यह सुनिश्चित करना होगा कि आप अपने शेल के बिलिन कमांड का उपयोग नहीं कर रहे हैं time, कम से कम bashबिलिन उस विकल्प को प्रदान नहीं करता है! इसलिए आपको timeउपयोगिता का पूरा रास्ता देने की आवश्यकता है :

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

आप पूर्ण पथ को निर्दिष्ट किए बिना गैर-अंतर्निहित का उपयोग भी कर सकते हैं: stackoverflow.com/questions/29540540/…
Ciro Santilli 郝海东 non non non

14

यदि आप कमांड के एरर आउटपुट के बारे में परवाह करते हैं तो आप बिल्ट-इन टाइम कमांड का उपयोग करते हुए उन्हें इस तरह अलग कर सकते हैं।

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

या

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

जैसा कि आप देखते हैं कि कमांड की त्रुटियां एक फ़ाइल पर जाती हैं (क्योंकि stderrइसका उपयोग किया जाता है time)।

दुर्भाग्य से आप इसे किसी दूसरे हैंडल (जैसे 3>&2) को नहीं भेज सकते क्योंकि यह अब बाहर मौजूद नहीं होगा{...}

उस ने कहा, यदि आप GNU समय का उपयोग कर सकते हैं, तो बस वही करें जो @Tim लुडविंस्की ने कहा।

\time -o time.log command

8

चूंकि 'टाइम' कमांड का आउटपुट एरर आउटपुट होता है, इसलिए इसे स्टैंडर्ड प्रोसेसिंग के रूप में रीडायरेक्ट करना आगे की प्रोसेसिंग करने के लिए अधिक सहज होगा।

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

6

यदि आप bash बिल्ट-इन के बजाय GNU समय का उपयोग कर रहे हैं, तो प्रयास करें

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
12

इसके अलावा GNU समय के लिए प्रारूप बैश बिलिन के समान नहीं है, जिससे स्वचालित पार्सिंग की समस्या उत्पन्न होती है।
गूस

3

मैंने प्रयोग करके समाप्त किया:

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
  • जहां "a" एपेंड है
  • जहां "ओ" को फ़ाइल नाम से आगे बढ़ना है
  • जहां "एफ" एक प्रिंटफ-जैसे सिंटैक्स के साथ प्रारूपित होता है
  • जहाँ "% E" 0:00 का उत्पादन करता है; घंटे: मिनट: सेकंड
  • मुझे आह्वान करना पड़ा / usr / bin / time क्योंकि bash "time" इसे रौंद रहा था और इसके समान विकल्प नहीं थे
  • मैं सिर्फ फाइल करने के लिए आउटपुट प्राप्त करने की कोशिश कर रहा था, ओपी जैसी चीज नहीं

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

यदि आप मूल प्रक्रिया 'stdout और stderr' को नहीं छूना चाहते हैं, तो आप विवरणक 3 और पीछे फाइल करने के लिए stderr को पुनर्निर्देशित कर सकते हैं:

$ { 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'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.