मैं time
एक कमांड चाहता हूं जिसमें एक पाइपिंग आउटपुट से दूसरे में दो अलग-अलग कमांड होते हैं। उदाहरण के लिए, नीचे दो लिपियों पर विचार करें:
$ cat foo.sh
#!/bin/sh
sleep 4
$ cat bar.sh
#!/bin/sh
sleep 2
अब, मुझे time
समय लगने की सूचना कैसे मिल सकती है foo.sh | bar.sh
(और हां, मुझे पता है कि पाइप का यहां कोई मतलब नहीं है, लेकिन यह सिर्फ एक उदाहरण है) यह अपेक्षा के अनुरूप काम करता है यदि मैं उन्हें बिना पाइपिंग के एक उप-क्रम में क्रमिक रूप से चलाता हूं:
$ time ( foo.sh; bar.sh )
real 0m6.020s
user 0m0.010s
sys 0m0.003s
लेकिन मुझे यह काम करने के लिए नहीं मिल सकता जब पाइपिंग:
$ time ( foo.sh | bar.sh )
real 0m4.009s
user 0m0.007s
sys 0m0.003s
$ time ( { foo.sh | bar.sh; } )
real 0m4.008s
user 0m0.007s
sys 0m0.000s
$ time sh -c "foo.sh | bar.sh "
real 0m4.006s
user 0m0.000s
sys 0m0.000s
मैंने इसी तरह के प्रश्न के माध्यम से पढ़ा है ( कई कमांड पर समय कैसे चलाएं और फाइल करने के लिए समय आउटपुट लिखें? ) और स्टैंडअल time
एक्जीक्यूटिव की कोशिश भी की :
$ /usr/bin/time -p sh -c "foo.sh | bar.sh"
real 4.01
user 0.00
sys 0.00
यह काम नहीं करता है अगर मैं एक तीसरी स्क्रिप्ट बनाता हूं जो केवल पाइप चलाता है:
$ cat baz.sh
#!/bin/sh
foo.sh | bar.sh
और फिर उस समय:
$ time baz.sh
real 0m4.009s
user 0m0.003s
sys 0m0.000s
दिलचस्प बात यह है time
कि यह पहली कमांड होते ही बाहर नहीं निकलता है। अगर मैं इसे बदलूं bar.sh
:
#!/bin/sh
sleep 2
seq 1 5
और फिर time
दोबारा, मैं उम्मीद कर रहा था कि time
आउटपुट प्रिंट होने से पहले होगा seq
लेकिन यह नहीं है:
$ time ( { foo.sh | bar.sh; } )
1
2
3
4
5
real 0m4.005s
user 0m0.003s
sys 0m0.000s
ऐसा लगता है कि इसकी रिपोर्ट 1 को प्रिंट करने से पहले खत्म होने के इंतजार के बावजूद इसे time
निष्पादित करने में लगने वाले समय की गिनती नहीं है ।bar.sh
सभी परीक्षण एक आर्क सिस्टम पर चलाए गए और बैश 4.4.12 (1) -release का उपयोग किया गया। मैं केवल प्रोजेक्ट के लिए बैश का उपयोग कर सकता हूं, यह एक हिस्सा है भले ही zsh
या कोई अन्य शक्तिशाली शेल इसके चारों ओर मिल सकता है, जो मेरे लिए एक व्यवहार्य समाधान नहीं होगा।
तो, मुझे समय कैसे मिल सकता है जब पाइप किए गए कमांड का एक सेट चलाने के लिए लिया गया हो? और, जब हम इस पर हैं, तो यह काम क्यों नहीं करता है? ऐसा लगता है कि जैसे time
ही पहला कमांड समाप्त हुआ , तुरंत बाहर निकल गया। क्यूं कर?
मुझे पता है कि मैं व्यक्तिगत समय को कुछ इस तरह से प्राप्त कर सकता हूं:
( time foo.sh ) 2>foo.time | ( time bar.sh ) 2> bar.time
लेकिन मैं अभी भी जानना चाहूंगा कि क्या पूरे ऑपरेशन को एकल ऑपरेशन के रूप में करना संभव है।
1 यह एक बफर मुद्दा हो प्रतीत नहीं होता है, मैं के साथ स्क्रिप्ट चला की कोशिश की unbuffered
और stdbuf -i0 -o0 -e0
और यह संख्या अब भी पहले मुद्रित हुए time
उत्पादन।