আমি 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
সমস্ত পরীক্ষাগুলি একটি আর্চ সিস্টেমে চালিত হয়েছিল এবং ব্যাশ ৪.৪.১২ (১) রিলেজ ব্যবহার করে। আমি কেবলমাত্র প্রকল্পের জন্য ব্যাশ ব্যবহার করতে পারি এটি একটি অংশ তাই এমনকি যদি zsh
বা অন্য কোনও শক্তিশালী শেল এটির আশেপাশে পেতে পারে তবে এটি আমার পক্ষে একটি কার্যকর সমাধান হবে না।
সুতরাং, পাইপযুক্ত কমান্ডগুলির একটি সেট চালানোর জন্য আমি কীভাবে সময় পাব? এবং, আমরা যখন এটি করছি, এটি কেন কাজ করে না? দেখে মনে হচ্ছে time
প্রথম কমান্ডটি শেষ হওয়ার সাথে সাথেই তা প্রস্থান করা হবে। কেন?
আমি জানি আমি পৃথক সময় এরকম কিছু দিয়ে পেতে পারি:
( time foo.sh ) 2>foo.time | ( time bar.sh ) 2> bar.time
তবে আমি এখনও জানতে চাই যে এটি সম্পূর্ণরূপে একক ক্রিয়াকলাপ হিসাবে সময় দেওয়া সম্ভব কিনা।
1 এই একটি বাফার ইস্যু হবে বলে মনে হচ্ছে না, আমি স্ক্রিপ্ট চলমান চেষ্টা unbuffered
এবং stdbuf -i0 -o0 -e0
এবং সংখ্যার এখনও সেই আগের মুদ্রিত হয়েছে time
আউটপুট।