मैं "समय" कमांड के आउटपुट को कैसे पुनर्निर्देशित कर सकता हूं?


95

मैंने समय कमांड के आउटपुट को पुनर्निर्देशित करने की कोशिश की, लेकिन मैं नहीं कर सका:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

फाइल में मैं lsकमांड का आउटपुट देख सकता हूं , न कि time। कृपया समझाएं, मैं ऐसा क्यों नहीं कर सका।


1
सुपरसुअर पर होना चाहिए, मुझे लगता है।
Mnementh

1
इस सवाल का जवाब न केवल प्रोग्रामर के लिए, बल्कि अन्य शक्ति-उपयोगकर्ताओं के लिए भी रुचि रखते हैं: superuser.com
Mnementh

जवाबों:


104

आप समय उत्पादन का उपयोग कर पुनर्निर्देशित कर सकते हैं,

(time ls) &> file

क्योंकि आपको एक ही कमांड के रूप में (समय एलएस) लेने की आवश्यकता है ताकि आप ब्रेसिज़ का उपयोग कर सकें।


1
हाँ, ठीक ठीक है, लेकिन सवाल यह है कि उन्होंने यह कैसे किया?
अबूबकर

2
समय कमांड एक कमांड के रूप में तर्कों को ले जाएगा। लेकिन कोष्ठक एक आदेश के रूप में समूह करेगा। Ex: time ls> file1.txt इन तर्कों में, 0 = समय 1 = "ls> file1.txt"
sganesh

8
और समय कमांड आउटपुट को स्टादर में प्रिंट करता है। तो आप (समय ls) 2> फ़ाइल
sganesh

5
&>कृपया कृपया स्पष्ट करें, मैं इनके बारे में कहाँ से जान सकता हूँ?
हेलो_थेरे_ंडी

3
@hello_there_andy &>fileके अनुरूप है >file 2>&1। यह स्टडआउट और स्टेडर दोनों को निर्देशित करता है।
ktbiz

129

उप शेल लॉन्च करने की आवश्यकता नहीं है। एक कोड ब्लॉक का भी उपयोग करेंगे।

{ time ls; } 2> out.txt

या

{ time ls > /dev/null 2>&1 ; } 2> out.txt

1
सहमत, सर्वश्रेष्ठ जवाब। आपको ls परिणामों को खोदने का विकल्प देता है और बस समय मिलता है। थैंक्यू घोस्टडॉग74
rd42

1
यह AIX के साथ काम करता है जब कुछ भी "होस्टेंट" कमांड के आउटपुट को रीडायरेक्ट नहीं कर सकता है। धन्यवाद!
ह्यूगो

1
2>कृपया पर स्पष्टीकरण । मैं इनके बारे में कहाँ से जान सकता हूँ?
हेलो_थेरे_ंडी

3
यदि मैं एक ही समय में दोनों> और 2> चाहता हूं तो मैं इसे कैसे करूं?
जॉर्ज फर्नांडीज

25

कमांड टाइम यह STDERR (STDOUT के बजाय) को आउटपुट भेजता है। ऐसा इसलिए है क्योंकि कमांड सामान्य रूप से समय के साथ निष्पादित होता है (इस मामले में ls) STDOUT को आउटपुट।

यदि आप समय का आउटपुट कैप्चर करना चाहते हैं, तो टाइप करें:

(time ls) 2> filename

यह केवल समय के उत्पादन को पकड़ता है, लेकिन एलएस का उत्पादन कंसोल पर सामान्य हो जाता है। यदि आप दोनों को एक फ़ाइल में कैप्चर करना चाहते हैं, तो टाइप करें:

(time ls) &> filename

2> STDERR को पुनर्निर्देशित करता है, और> दोनों को पुनर्निर्देशित करता है।


1
यह जवाब वास्तव में जवाब देता है कि ओपी का पुनर्निर्देशन काम क्यों नहीं कर रहा था, जो ओपी पूछ रहा था उन सवालों में से एक था। कोई और इसे संबोधित नहीं करता है।
न्यूट्रॉनस्टार

इसके साथ कोई अन्य प्रक्रिया कैसे करेगा?
पॉल

10

समय शेल बिलिन है और मुझे यकीन नहीं है कि अगर इसे पुनर्निर्देशित करने का कोई तरीका है। हालांकि आप /usr/bin/timeइसके बजाय उपयोग कर सकते हैं , जो निश्चित रूप से किसी भी आउटपुट पुनर्निर्देशन को स्वीकार करते हैं।


/ usr / bin / time --output फ़ाइल नाम ls
चब

4
निर्मित समय आउटपुट-पुनर्निर्देशन के साथ अच्छी तरह से काम करता है। यह केवल STDERR पर आउटपुट करता है, STDOUT पर नहीं।
Mnementh

समस्या यह है कि बिलियन कमांड को शेल वातावरण में ही निष्पादित किया जाता है, न कि सबस्क्रिप्शन। चूँकि आपके शेल का स्टेटर आमतौर पर टर्मिनल से जुड़ा होता है, इसलिए पुनर्निर्देशन कुछ भी नहीं करेगा। अंतर्निहित समय को पुनर्निर्देशित करने के लिए, मेरा मानना ​​है कि आपको कुछ ऐसा करना होगा bash time mycmd 2>file। या /usr/bin/timeजैसा बताया गया था वैसा ही कॉल करें ।
ktbiz

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

4

यदि आप आउटपुट timeऔर कमांड से मिश्रण नहीं करना चाहते हैं । GNU समय के साथ, आप निम्न का उपयोग कर सकते हैं -o file:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

जबकि समय timका उत्पादन है, outऔर errसे stdout और stderr हैं grep


4

पुनर्निर्देशन के कारण काम नहीं करने का कारण timeयह है कि यह एक पाइपलाइन के सामने इस्तेमाल किए जाने पर बैश आरक्षित शब्द है (बिल्टिन नहीं!)। बैश (1):

यदि समय आरक्षित शब्द एक पाइपलाइन से पहले है, तो बीतने के साथ-साथ उपयोगकर्ता और सिस्टम समय जो इसके निष्पादन द्वारा खपत होती है, जब पाइप लाइन समाप्त हो जाती है।

इसलिए, आउटपुट को पुनर्निर्देशित करने के लिए time, या तो घुंघराले ब्रेसिज़ का उपयोग करें:

{ time ls; } 2> filename

या कॉल करें /usr/bin/time:

/usr/bin/time ls 2> filename

0

मैं परीक्षण के लिए ब्रेसिज़ के साथ स्टडआउट और स्टेडर विधि के पुनर्निर्देशन का उपयोग करता हूं। यह लेकिन कम
का &>>rptप्रतिनिधित्व करता है >>rpt 2>&1
ब्रेसिज़ चालू शेल में एक कमांड निष्पादित करेगा। देखें: आदमी बैश

{ time ls a*; } &>>rpt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.