मैं एक ही पाइप से `टाइम` आउटपुट और कमांड आउटपुट को रीडायरेक्ट कैसे कर सकता हूं?


24

मान लीजिए कि मेरे पास एक बाइनरी है जिसे कहा जाता है foo

अगर मैं fooकिसी अन्य प्रक्रिया के आउटपुट को पुनर्निर्देशित करना चाहता हूं bar, तो मैं लिख सकता हूं ./foo | bar

दूसरी ओर, अगर मैं timeफू करना चाहता था , और timeमैं जो लिख सकता था, उसके आउटपुट को रीडायरेक्ट करता हूं time (./foo) | bar

मेरा सवाल यह है कि मैं आउटपुट के timeअंत तक आउटपुट को कैसे चिपका सकता हूं fooऔर उसी पाइप के माध्यम से पाइप कर सकता हूं ?

निम्नलिखित समाधान वह नहीं है जो मैं खोज रहा हूं, क्योंकि यह प्रक्रिया के दो अलग-अलग उदाहरणों को शुरू करता है bar, जबकि मैं एक एकल साझा पाइप चाहता हूं, जिसके एक ही उदाहरण के लिए bar

time (./foo | bar)  | bar

जो कोई भी जिज्ञासु है, उसके लिए दो उदाहरणों को शुरू नहीं करने barका कारण है क्योंकि barएक नेटवर्क क्लाइंट हो सकता है और मैं चाहता हूं कि समय की जानकारी सर्वर को उसी http POSTसंदेश के हिस्से के रूप में भेजा जाए जो प्रक्रिया आउटपुट के रूप में है।


यहाँ जवाब दिया, कुछ हद तक बेहतर जवाब: stackoverflow.com/questions/13356628/…
JDS

जवाबों:


29

अगर मुझे समझ में आ गया कि तुम मुझसे क्या माँग रहे हो तो मैं यह करूँगा। मैं कमांड का उपयोग कर रहा हूँ ls ~और teeस्टैंड-इन के लिए ./fooऔर bar, लेकिन आप जो चाहते हैं उसका सामान्य रूप यह है:

$ ( time ./foo ) |& bar

नोट: का उत्पादन timeपहले से ही किसी भी आउटपुट के अंत में संलग्न ./fooकिया जा रहा है, यह सिर्फ STDERR पर किया जा रहा है। पाइप के माध्यम से इसे पुनर्निर्देशित करने के लिए आपको STDERR को STDOUT के साथ संयोजित करने की आवश्यकता है। आप |&या 2>&1तो ऐसा करने के लिए उपयोग कर सकते हैं ।

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

उदाहरण

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

और यहाँ cmd.logद्वारा उत्पादित फ़ाइल की सामग्री है tee

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

ध्यान दें कि यह सिंटैक्स BASH के लिए काम नहीं करता है।
jvriesem

1
@jvriesem सभी उदाहरणों से बैश हैं
SLM

9

timeडिफ़ॉल्ट रूप से stdout के बजाय stderr को इसका आउटपुट भेजता है। आपको बस इसे पुनर्निर्देशित करने की आवश्यकता है कि आप इसे कहाँ चाहते हैं।

आप कहते हैं "दूसरी तरफ, अगर मैं timeफू करना चाहता था , और timeमैं जो लिख सकता था उसके आउटपुट को रीडायरेक्ट करता हूं time (./foo) | bar।" लेकिन यह वास्तव में गलत है। इस स्थिति में, समय का उत्पादन अभी भी आपके कंसोल पर प्रदर्शित किया जाएगा, केवल स्टडआउट को पुनर्निर्देशित किया जाएगा।

आप विशेष रूप से stderr पुनर्निर्देशित कर सकते हैं:

(time foo) 2>&1 | bar

या सभी पाइपों के साथ:

(time foo) |& bar

सही ढंग से काम करने के लिए कोष्ठक की आवश्यकता होती है।


0

मैंने पाया कि यह सोलारिस पर काम करता है। (time ls) &> file


1
यह मौजूदा समाधानों में से कोई भी अलग नहीं है
रोआइमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.