টি পাইপ থেকে পুরো আউটপুট পায় না


12

আমার কাছে স্ক্রিপ্ট রয়েছে যেমন:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

সমস্যাটি সম্ভবত পাইপের মধ্যে রয়েছে tee। এটি পুরো আউটপুট পাবে বলে মনে হয় না। অ্যাপ্লিকেশনটি আউটপুটটির শেষ কয়েকটি লাইন ছেড়ে দিলে (সাধারণত যারা মারাত্মক ত্রুটিযুক্ত) অনুপস্থিত। আমি যখন পাইপ ছাড়াই অ্যাপটি চালিত করি তখন teeসেগুলি আউটপুট এ পাই।

আমি কীভাবে স্ক্রিপ্টটিকে সমস্ত আউটপুট প্রক্রিয়াজাতকরণের জন্য টিয়ের জন্য অপেক্ষা করতে বাধ্য করতে পারি?


স্টাডআউট না করে আপনি যদি কোনও ফাইলের কাছে এটি টিপান তবে এটি কি ঠিক কাজ করে?
পাইলট 6

উত্তর:


23

মারাত্মক ত্রুটিটি সম্ভবত STDERR (2) এ প্রকাশিত হবে, STDOUT (1) নয়। আপনি STDERR কে STDOUT এ পুনর্নির্দেশ করতে পারেন 2>&1এবং তারপরে পাইপটিও এটি ক্যাপচার করা উচিত।

./some_app -i $INDEX 2>&1 | tee $LOG

আপনার যদি শীর্ষে বাফারিংয়ের সমস্যা থাকে তবে আপনি এটিকে বাধ্যহীন অবস্থায় জোর করতে পারেন:

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG

ভাল, আমরা কাছাকাছি হয়। এখন আমি দেখতে পাচ্ছি যে মারাত্মক ত্রুটি মুদ্রিত হচ্ছে কিন্তু আবার এটি সম্পূর্ণ হয় না। ত্রুটির সাথে রেখাটি মাঝখানে শেষ হয় এবং প্রতিধ্বনি আউটপুট অব্যাহত থাকে। ফ্লাশিং বাফার বা কেবলমাত্র সেই অংশটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করা নিয়ে এখনও কিছু সমস্যা রয়েছে।
লাডিস্লাভ Mrnka

সম্পাদনা করা হয়েছে। আমার অভিজ্ঞতায় মোটামুটি বিরল যে প্রস্থান করার সময় বাফারগুলির মাধ্যমে এমন কিছু পুরোপুরি পিছলে যায় তবে তা যাওয়ার মতো মূল্য worth
অলি

1
সম্পন্ন! ধন্যবাদ. আমি হয়ত অনেকগুলি প্রশ্ন জিজ্ঞাসা করছি তবে কেউ কি বুঝতে পারে যে অন্য প্রক্রিয়াতে পাইপ দেওয়ার সময় আমাকে কেন বাফারিং বন্ধ করতে হবে?
লাডিস্লাভ Mrnka

@ অলি খুব ভাল!
পাইলট 6

6

যেহেতু ত্রুটি বার্তাগুলি সাধারণত STDERR (ফাইল বর্ণনাকারী 2) এ প্রদর্শিত হয়, আপনাকে STDOUT এবং STDERR উভয়ই এখানে পুনঃনির্দেশ করতে হবে tee:

./some_app -i "$INDEX" |& tee "$LOG"

আপনি যখন করবেন ./some_app -i $INDEX | tee $LOGকেবলমাত্র STDOUT এ পুনঃনির্দেশ করছেন tee

|& STDOUT এবং STDERR উভয়ই পুনঃনির্দেশিত করবে।

যদি আপনি কেবল স্টাডিআউটকে পুনর্নির্দেশ করতে না পারেন (যেমন আপনি ছিলেন):

./some_app -i "$INDEX" | tee "$LOG"

অন্যদিকে আপনি যদি কেবল এসটিডিআরআর পুনর্নির্দেশ করতে চান:

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.