আমি কি ট্রাম্পের জন্য বাফারিং অক্ষম করতে পারি?


10

trএটির ইনপুটটি বাফার করছে বলে মনে হচ্ছে যাতে LongRunningCommand|tr \\n ,লংআরনিংকম্যান্ড থেকে কয়েক কিলোবাইট ইনপুট জমা হওয়ার পরে এই আদেশটি কেবল আউটপুট উত্পাদন শুরু করবে।

trএই বাফারিং বা অন্য কোনও কমান্ড বাফারিং ছাড়াই একটি নতুন চরিত্রের সাথে নতুন রেখাগুলি প্রতিস্থাপন করতে পারে এমন কোনও কমান্ড বন্ধ করার জন্য কি কোনও উপায় আছে ?


পিএস আমি ইতিমধ্যে সাফল্য ছাড়াই পাইপে বাফারিং বন্ধ করুন থেকে প্রথম দুটি পরামর্শ চেষ্টা করেছি ।


1
stdbufআপনি লংআরনিংকম্যান্ডে আবেদন করেছেন বা ট্র, বা উভয়কে আলাদাভাবে?
meuh

উভয়ের জন্য এটির মতো:stdbuf -o0 fping -aAq -r2 -g 10.30.0.1 10.30.0.255 2>/dev/null | stdbuf -i0 tr \\n ,
এনডেমো

fping -q"প্রতি-পরীক্ষার ফলাফলগুলি দেখাবেন না, কেবলমাত্র চূড়ান্ত সারাংশ" বলেছিলেন, সুতরাং সম্ভবত এটি কেবল শেষে দীর্ঘকাল লিখতে পারে?
meuh

কোনও ফপিং কমান্ড নিজেই ঠিক কাজ করে না। পরামর্শের জন্য অনেক ধন্যবাদ যদিও
nddou

2
আমি মনে করি বাফারিং সমস্যা আসলে আউটপুট এর tr। চেষ্টা করুন|stdbuf -i0 -o0 tr ...
meuh

উত্তর:


12

কমান্ডগুলি সাধারণত তাদের ইনপুটটি বাফার করে না। তারা read()একটি বড় অংশের জন্য একটি কাজ করবে , কিন্তু যখন পাইপ থেকে পড়তে হবে, পাইপে যদি এমন অনেকগুলি বাইট না থাকে তবে read()সিস্টেম কলটি যতগুলি অক্ষর রয়েছে তার সাথে ফিরে আসবে এবং অ্যাপ্লিকেশনটি যদি এটি করতে পারে তবে এটির সাথে সাধারণত কাজ করবে ।

এটির ক্ষেত্রে একটি উল্লেখযোগ্য ব্যতিক্রম mawkযা read()ইনপুট বাফারটি পূর্ণ না হওয়া পর্যন্ত পুনরায় চালু রাখতে থাকবে।

অ্যাপ্লিকেশনগুলি যদিও তাদের আউটপুট (স্টাডআউট) বাফার করে । স্বাভাবিক আচরণটি হ'ল যদি আউটপুটটি একটি টিটি-তে চলে যায়, তবে বাফারিংটি লাইন-ওয়াইস হবে (অর্থাৎ এটি আউটপুটে সম্পূর্ণ লাইন না হওয়া পর্যন্ত স্টাডাউটে লেখা শুরু করবে না বা খুব বেশি ব্লক-পূর্ণ হবে) দীর্ঘ লাইন), অন্য প্রতিটি ধরণের ফাইলের জন্য, বাফারিংগুলি ব্লকগুলি দ্বারা হয় (এটি লেখার জন্য একটি ব্লক পূর্ণ না হওয়া পর্যন্ত এটি লেখা শুরু করবে না (4KiB / 8KiB এর মতো কিছু ... সফ্টওয়্যার এবং সিস্টেমের উপর নির্ভর করে ))।

সুতরাং আপনার ক্ষেত্রে LongRunningCommandসম্ভবত এটির ফলাফলকে ব্লক দ্বারা বাফার করে (যেহেতু এর আউটপুটটি পাইপ এবং কোনও টিটি নয়) এবং trসম্ভবত আউটপুটটি টার্মিনাল হওয়ায় সম্ভবত আউটপুটটিকে লাইন দিয়ে বাফার করে।

তবে, যেহেতু আপনি প্রতিটি নিউলাইন চরিত্রটিকে এর আউটপুট থেকে সরান, এটি কখনই একটি লাইন আউটপুট দেয় না, তাই বাফারিং ব্লক হয়ে যাবে।

তাই এখানে আপনি উভয় জন্য অক্ষম বাফার উপলব্ধ করতে চান LongRunningCommandএবং tr। জিএনইউ বা ফ্রিবিএসডি সিস্টেমে:

stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,

মনে রাখবেন যে আপনি যদি কমা দিয়ে লাইনে যোগদান করতে চান তবে আরও ভাল পদ্ধতির ব্যবহার করা উচিত paste -sd , -। এই ভাবে আউটপুটটি একটি নতুন লাইন চরিত্রের মাধ্যমে শেষ করা হবে (আপনার সম্ভবত এখনও বাফারিং অক্ষম করা দরকার)।


@mikeserv। হ্যাঁ, এবং স্টিডিও বাফারিং ব্যবহার করে এমন একটি এবং সেটভুফ / সেটবুফারকে কল করে না ... নিজে থেকে এবং এটি শেল বিল্টিন নয়। তবে সাধারণত জিএনইউ এবং ফ্রিবিএসডি সিস্টেমগুলিতে এই সমস্ত শর্তটি সন্তুষ্ট।
স্টাফেন চেজেলাস

উহু. আমি কেবল শিখেছি যে কয়েকদিন আগে আমি যখন হতাশ হয়ে পড়েছিলাম যে আমি আমার স্ট্যাটিকালি সংকলিত আই / ও স্ট্রিমগুলিকে প্রভাবিত করতে পারি না sed। দুঃখিত যদি এটি বিরক্তিকর হয় - তবে আমি বুঝতে পারি নি যে এটি সাধারণ জ্ঞান ছিল। আমার ধারণা এটি LD_PRELOAD ব্যবহার করে।
মাইকজার্ভ

স্টাফেন কী ঘটে তার বিশদ ব্যাখ্যার জন্য ধন্যবাদ। দুর্দান্তভাবে প্রশংসা করা হয়েছে
nddou

5

এর সাথে নিউলাইনগুলি প্রতিস্থাপন ","করতে, আপনি চালাতে পারেন

awk '{ printf "%s,", $0 }'

GNU awk ( gawk) এবং সোলারিস স্টিডিনে nawkলাইন বাফারিং সহ চলবে এবং আউটপুট যখন টার্মিনালে যাবে তখন কোনও বাফারিং স্টডআউট হবে না। যদি আপনার অ্যাজক হয় mawk, যা উবুন্টুতে ঘটে থাকে, আপনি এটি -W interactiveএকইরকম বাফারিং আচরণ পেতে বিকল্প দিতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.