एकाधिक कमांड पर समय कैसे चलाएं और फाइल करने के लिए समय आउटपुट लिखें?


65

मैं timeकई कमांडों का समय मापने के लिए कमांड चलाना चाहता हूं ।

मुझे क्या करना है:

  • एक साथ जोड़े गए सभी के चलने के समय को मापें
  • timeफ़ाइल में आउटपुट लिखें
  • STDERRमैं जिस कमांड को माप रहा हूं, उससे लिखेंSTDERR

जो मैं नहीं करना चाहता, वह है

  • एक अलग स्क्रिप्ट में कई कमांड्स लिखें (क्यों? क्योंकि यह सब पहले से ही एक स्क्रिप्ट है जिसे मैं प्रोग्रामेटिक रूप से जेनरेट कर रहा हूं, और ANOTHER की अस्थायी स्क्रिप्ट बनाना मेरी इच्छा से अधिक गड़बड़ होगा)

मैंने अब तक क्या कोशिश की:

/usr/bin/time --output=outtime -p echo "a"; echo "b";

काम नहीं करता है, timeकेवल पहले एक पर चलाया जाता है।

/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )

काम नहीं करता है, (अप्रत्याशित टोकन है।

/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }

काम नहीं करता है, "ऐसी कोई फ़ाइल या निर्देशिका नहीं"।

/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'

काम नहीं करता है, "ऐसी कोई फ़ाइल या निर्देशिका नहीं"।

time ( echo "a"; echo "b"; ) 2>outtime

काम नहीं करता है, क्योंकि यह सभी STDERRमें पुनर्निर्देश करता है outtime; मुझे timeवहां केवल आउटपुट चाहिए।

और निश्चित रूप से,

time --output=outime echo "a";

तब से काम नहीं करता है --output=outime: command not found

मैं यह कैसे कर सकता हूं?

जवाबों:


90

sh -c 'commands'कमांड के रूप में उपयोग करें , जैसे:

/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'

2
एक छोटा संस्करण:time -p sh -c 'echo "a"; echo "b"'
जियो

7

इसे इस्तेमाल करे:

% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput                                
( { echas z; echo 2; } 2>&3; )  0.00s user 0.00s system 0% cpu 0.004 total

स्पष्टीकरण:

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

% time whatever 2>timeoutput
whatever 2> timeoutput  0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput 
zsh: command not found: whatever

[नोट: जानोस की टिप्पणी का तात्पर्य है कि यह मामला नहीं है bash।] हम एक timeउप में चलाकर timeऔर फिर उस उपधारा के उत्पादन को पुनर्निर्देशित करके आउटपुट के पुनर्निर्देशन को प्राप्त कर सकते हैं ।

% (time whatever) 2> timeoutput
% cat timeoutput 
zsh: command not found: whatever
whatever  0.00s user 0.00s system 0% cpu 0.018 total

अब हमने सफलतापूर्वक timeइसके आउटपुट को रीडायरेक्ट कर दिया है , लेकिन इसका आउटपुट उस कमांड के एरर आउटपुट के साथ मिलाया जाता है जिसे हम माप रहे हैं। दोनों को अलग करने के लिए, हम एक अतिरिक्त फ़ाइल डिस्क्रिप्टर का उपयोग करते हैं।

"बाहर" पर हमारे पास है

% (time ... ) 3>&2 2>timeout

इसका मतलब है: जो कुछ भी फाइल डिस्क्रिप्टर 3 में लिखा गया है, वह उसी जगह फाइल डिस्क्रिप्टर 2 के लिए आउटपुट होगा (मानक त्रुटि) अब (टर्मिनल) आउटपुट कर रहा है। और फिर हम फ़ाइल में मानक त्रुटि को पुनर्निर्देशित करते हैं timeout

तो अब हमारे पास है: stdout और fd 3 को लिखी गई हर चीज टर्मिनल पर जाएगी, और stderr को लिखी गई हर चीज फाइल में जाएगी। जो कुछ बचा है वह मापा कमांड के stderr को fd 3 में पुनर्निर्देशित करना है।

% (time whatever 2>&3) 3>&2 2>timeout

अब, समय को एक से अधिक कमांड को मापने के लिए, हमें उन्हें (अन्य!) उपधारा (कोष्ठक के अंदर) में चलाने की आवश्यकता है। और उन सभी के त्रुटि उत्पादन को 3 fd पर पुनर्निर्देशित करने के लिए, हमें उन्हें घुंघराले कोष्ठक के अंदर समूहित करने की आवश्यकता है।

तो, आखिरकार, हम यहां पहुंचे:

% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput

बस।


यह POSIX शेल में एक सिंटैक्स त्रुटि है। शायद एक bashism?
josch

@ जोश यहां इस्तेमाल किया गया खोल zsh है।
एंगस

6

सही उत्तर नहीं है लेकिन प्रश्न से संबंधित है।
कई कार्यक्रमों के लिए समय के आँकड़े प्राप्त करें, संयुक्त कोष्ठक आवश्यक हैं। अर्धविराम के साथ अलग-अलग कमांड।

time ( command1 ; command2 )

1
यह अच्छा है। बेहतर अभी तक, कमांड के बीच && का उपयोग करें - जैसे time ( command1 && command2 )कि यदि पहला कमांड विफल रहता है; यह दूसरे को क्रियान्वित करने के लिए आगे नहीं बढ़ेगा।
bikashg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.