পড়ার আগে স্টিডিন সাফ করুন


14

আমার কাছে নিম্নলিখিত বাশ স্ক্রিপ্ট রয়েছে:

# do some time consuming task here
read -p "Give me some input: " input

এখন আপনি যেমন অনুমান করতে পারেন, যদি কোনও ব্যবহারকারী "সময় গ্রহণের কাজ" এর সময় কিছু এলোমেলো কী টিপেন, অযাচিত ইনপুটটিকেও বিবেচনায় নেওয়া হবে। stdinরিড কমান্ড দেওয়ার আগে আমি কীভাবে সাফ করব (বা অন্তত তা উপেক্ষা করব)?


1
নিজেই, আপনি যদি কোনও অভিশাপের মতো প্রোগ্রাম না লিখে থাকেন তবে আমি আপনার প্রোগ্রামে ডিজাইনের ত্রুটি হতে যা করতে চান তা পেয়েছি। ইউনিক্স / লিনাক্সের বাফারিং ইনপুট ("টাইপ-ফরোয়ার্ড") এর খুব দরকারী বৈশিষ্ট্য রয়েছে এবং আমি সাধারণত এই কার্যকারিতাটি ব্যবহার করি। আপনার টাইপ করা প্রোগ্রামটি যেখানে আপনি যা লিখেছেন তা ছুড়ে ফেলতে, আমি সম্ভবত একটি বাগ জমা দেব এবং এটি ঠিক না হওয়া অবধি আপনার প্রোগ্রামটি ব্যবহার বন্ধ করব।
আর্জেজ

1
কিছু ব্যবহারকারীদের প্রোগ্রামটি কিছু করতে ব্যস্ত থাকাকালীন কীবোর্ডের সাথে পিয়ানো বাজানোর অভ্যাস রয়েছে। আমি বরং এই কী-স্ট্রোকগুলি ফেলে দিয়ে নতুন করে শুরু করতে চাই। তবে আপনি ঠিক বলেছেন, "টাইপ-ফরোয়ার্ড" দরকারী তবে সর্বদা নয়।
রাবিন

উত্তর:


8

আমি মনে করি না স্টিডিন সাফ করার কোনও উপায় আছে তবে (ব্যাশ দিয়ে) আপনি ইনপুট জিজ্ঞাসা করার আগে যা রয়েছে তা পড়তে এবং ফেলে দিতে পারেন

#do some time consuming task here
read -t 1 -n 10000 discard 
read -p "Give me some input: " input

এটি স্টিডিন পড়ে এবং এর সময়সীমা 1 সেকেন্ড হয়, স্টিডিনে 10000 এর বেশি অক্ষর থাকলেও এটি ব্যর্থ হয়। আমি জানি না আপনি কত বড় nchars প্যারামিটার তৈরি করতে পারেন।


আমি আসলে একটি ফোরামে এই হ্যাকটি পেয়েছি। আমি এটি করার আরও ভাল উপায় খুঁজে প্রত্যাশা ছিল। দৃশ্যত না.
রাবিন

@ আরবিন: আপনি যদি এখানে আরও ভাল কোনও পোস্ট খুঁজে পান তবে আমার কাছে এটি কয়েকটি স্ক্রিপ্টে আছে।

দুর্ভাগ্যক্রমে এটি সমস্ত শেলের সাথে কাজ করে না, উদাহরণস্বরূপ ড্যাশ :(
স্কাই

20

বাশ 4 এ, আপনি -t(সময়সীমা) সেট করতে পারেন 0। এই ক্ষেত্রে, readতাত্ক্ষণিকভাবে একটি প্রস্থান স্থিতি দিয়ে ফিরে আসে যা নির্দেশ করে যে ডেটা অপেক্ষা করছে কি নেই:

# do some time consuming task here
while read -r -t 0; do read -r; done
read -p "Give me some input: " input

6
read -d '' -t 0.1 -n 10000

এটি ইনপুটগুলির একাধিক লাইন পড়ে, যদি ব্যবহারকারী অজ্ঞাতসারে একাধিকবার চাপলে


5

এটি আমার পক্ষে ভাল কাজ করেছে:

function clean_stdin()
{
    while read -e -t 0.1; do : ; done
}

কেন -eএই ক্ষেত্রে?
নেড়ে

@ এখনও নিশ্চিত নয়, সম্ভবত কিছু সিস্টেম নির্দিষ্ট সমস্যা সমাধানের জন্য
pschichtel

4

যার ব্লকটিতে স্টিডিন বন্ধ রয়েছে তাতে সময় সাপেক্ষ কাজটি বন্ধ করুন:

{
     # time consuming task
} <&-

read -p "Give me some input: " input

আমি বিশ্বাস করি যে এই প্রশ্নের সাথে কোন সম্পর্ক নেই।
স্কট

তবে তা করে! ব্যবহারকারী সমস্ত ইনপুট বাতিল করতে চায়। ইনপুটটিকে অনুমতি না দেওয়া ঠিক তা করে না - যেহেতু স্টিডিন বন্ধ রয়েছে তাই সমস্ত ইনপুট বাতিল করা হয় (সিস্টেমের দ্বারা)। এটি তার সমস্যার একটি মার্জিত সমাধান। তিনি বাতিল হওয়া লুপটি লেখার ঝামেলা ছাড়াই বাতিল করার ব্যবস্থা করে।
হাইটেকহিটচ

এটি এখন পর্যন্ত সবচেয়ে নির্ভরযোগ্য বিকল্প বলে মনে হচ্ছে।
স্টিফেন এলার্ট

নিখুঁত বলে মনে হচ্ছে তবে আমার কাজ করে না। আমি 5.0.0 এবং 4.4.19 বাশ চেষ্টা করেছি। readএখনও # time consumingকাজের সময় প্রবেশ করা প্রথম লাইনটি পড়বে । তদতিরিক্ত, যদি স্ক্রিপ্টটিতে স্ট্যান্ডিন পড়ার পরে কোনও কমান্ড না থাকে readতবে অপঠিত লাইনগুলি স্ক্রিপ্ট সমাপ্ত হওয়ার পরে ইন্টারেক্টিভ টার্মিনালে কার্যকর করা হয়। কেউ কি সফলভাবে এটি পরীক্ষা করেছে?
সোসোকি

4

ক্রিস্টোফাজিজারের উত্তরে বিল্ডিং করে, আমি যুক্ত করেছিলাম -sযাতে ইনপুটটি টার্মিনালে প্রতিধ্বনিত হয় না এবং -nযাতে এটি কোনও নতুন লাইনের জন্য অপেক্ষা না করে।

while read -r -t 0; do
    read -n 256 -r -s
done

ব্যবহার -nকরা ভাল ধারণা, তবে আগের দুটি উত্তর ইতিমধ্যে এটি উল্লেখ করেছে। এবং প্রদত্ত যে এই মহড়ার মূল বিষয়টি read হ'ল মৃত্যুদন্ড কার্যকর হওয়ার আগে টাইপ করা যে কোনও কিছু পড়ার এবং ফেলে দেওয়া , আমি বুঝতে পারি না আপনি কী ভাল করছেন বলে মনে করছেন -s
স্কট

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