`टाइम कमांड` में कमांड के आउटपुट को रीडायरेक्ट करें


11

मैं कुछ समय का उपयोग करने की कोशिश कर रहा हूं:

/usr/bin/time myCommand

हालाँकि, चूंकि /usr/bin/timestderr को लिखता है, अगर myCommand भी stderr को लिखता है, तो मुझे स्ट्रीम पर केवल समय के आउटपुट से अधिक मिलेगा। जो मैं करना चाहता हूं, वह है मायकाॅमैंड के सभी आउटपुट को रीडायरेक्ट करना /dev/null, लेकिन स्टैडर के लिए समय का आउटपुट लिखना। एक उदाहरण myCommand का उपयोग करते हुए जो stderr को लिखता है ls /nofile, हम देखते हैं कि (स्पष्ट रूप से) निम्न में से कोई भी आउटपुट नहीं है:

$ /usr/bin/time ls /nofile 2> /dev/null
$

किसी भी पुनर्निर्देशन के बिना, हम आउटपुट से ls(स्टोडर तक) और आउटपुट दोनों समय से देखते हैं (स्टडर के लिए भी):

$ /usr/bin/time ls /nofile
ls: cannot access /nofile: No such file or directory
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

मैं जो कुछ चाहता हूं वह बस पैदा करता है:

$ /usr/bin/time ls /nofile > RedirectThatImAskingFor
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

कोई विचार?


मैं स्क्रिप्ट फ़ाइल में समय कमांड का उपयोग कर रहा हूं। मैं stderout के बजाय stdout में समय उत्पादन चाहते हैं। मैं यह कैसे प्राप्त कर सकता हूं?

जवाबों:


20

Ksh, bash और zsh में, timeएक कीवर्ड है, एक अंतर्निहित नहीं है। एक ही पंक्ति पर पुनर्निर्देशन केवल समयबद्ध कमांड पर लागू होते हैं, timeस्वयं के आउटपुट पर नहीं ।

$ time ls -d / /nofile >/dev/null 2>/dev/null

real    0m0.003s
user    0m0.000s
sys     0m0.000s

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

{ time mycommand 2>&3; } 3>&2 2>mycommand.time

यदि आप स्टैंडअलोन timeउपयोगिता के जीएनयू संस्करण का उपयोग करते हैं , तो इसके पास stderr की तुलना -oमें timeकहीं और का आउटपुट लिखने का विकल्प है । आप timeटर्मिनल को लिख सकते हैं :

/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null

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

/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null

किसी भी timeउपयोगिता के साथ , आप वांछित पुनर्निर्देशन करने के लिए एक मध्यवर्ती शेल को आमंत्रित कर सकते हैं। अतिरिक्त क्रियाओं जैसे कि cdपुनर्निर्देशन इत्यादि को करने के लिए एक मध्यवर्ती शेल को आमंत्रित करना बहुत आम है - यह उस तरह की छोटी चीजें हैं जिन्हें शेल करने के लिए डिज़ाइन किया गया है।

/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'

कुछ फॉलोवर्स: 1) आपके अंतिम सुझाव में 'अमल' क्या होता है? यह इसके बिना काम करने लगता है: / usr / bin / time sh -c 'exec ls / nofile &> ./ output.dat' 2) एक "मध्यवर्ती शेल" है जो "सबमिडील" के समान है (जो आपको मिलेगा। कोष्ठक का उपयोग कर लगता है?)। मैं कुछ भी नहीं करने के लिए / usr / bin / time (ls / nofile &>। Output.dat) जैसी चीजों की कोशिश कर रहा था। 3) क्या है / देव / tty? मुझे पता है कि tty0 stdin, tty1 = stdout, tty2 = stderr है, लेकिन सिर्फ'ty 'के बारे में क्या?
डेविड डोरिया

4) / dev / fd3 विकल्प के साथ, ऐसा लगता है कि आप -o आउटपुट को 3 में लिखने के लिए कह रहे हैं, फिर 3 से 2, 1 से शून्य और 2 से शून्य पर रीडायरेक्ट करें। पुनर्निर्देशन के बाद दाएं से बाएं होने पर भी 3 से शून्य नहीं भेजना चाहिए?
डेविड डोरिया

1
@DavidDoria execउस प्रोग्राम को उपप्रोसेस के रूप में चलाने के बजाय शेल को बदल देता है। जब कोई कमांड किसी स्क्रिप्ट में सबसे आखिरी होता है तो कुछ गोले इस अनुकूलन को स्वचालित रूप से करते हैं। "इंटरमीडिएट शेल" का मतलब बस इतना है: एक शेल जो बीच में है timeऔर mycommand; यह सदस्यता से असंबंधित है। /dev/ttyवह टर्मिनल है जिस पर कमांड चल रही है (यह असंबंधित है /dev/ttyNUMजो भौतिक कंसोल हैं; आप फ़ाइल डिस्क्रिप्टर के साथ भ्रमित कर रहे हैं: स्टडिन /dev/fd/0, आदि)।
गिलेस एसओ- बुराई को रोकना '

@DavidDoria एक फाइल डिस्क्रिप्टर को बदलने का काम बाएं से दाएं से होता है, जिसका विपरीत प्रभाव होता है। देखें unix.stackexchange.com/questions/23964/... या unix.stackexchange.com/questions/37660/order-of-redirections
गाइल्स 'तथाकथित बंद किया जा रहा है बुराई'

0
[artur@asus-ux21e ~]$ find /etc/pki/CA/private/
/etc/pki/CA/private/
find: ‘/etc/pki/CA/private/’: Permission denied
[artur@asus-ux21e ~]$ time (find /etc/pki/CA/private/ &> /dev/null)

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

यह वही 'समय' नहीं है (यह एक बाश उर्फ ​​मेरा मानना ​​है)। ध्यान दें कि यह किसी भी समझदार पुनर्निर्देशन नियमों का पालन नहीं करता है? $ समय और> / देव / अशक्त असली 0m0.000s उपयोगकर्ता 0m0.000s sys 0m0.000s
डेविड डोरिया

1
इसके बारे में कैसे: / usr / bin / time -o time / usr / bin / find / etc / pki / CA / private / &> / dev / null; बिल्ली का समय
आर्टुर सिज़ेम्बकैक

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

@ दाविदोरिया आपको क्या संकेत दे रहा है कि timeएक बैश उर्फ ​​है? सेंटोस 5.7 में which timeप्रदर्शित करता /usr/bin/timeहै।
टिमोथी मार्टिन

type timeआपको दिखाएंगे:time is a shell keyword
Artur Szymczak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.