पढ़ने से पहले स्टड साफ़ करें


14

मेरे पास निम्नलिखित बैश स्क्रिप्ट है:

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

अब जैसा कि आपने अनुमान लगाया होगा, यदि कोई उपयोगकर्ता "समय लेने वाले कार्य" के दौरान कुछ यादृच्छिक चाबियाँ दबाता है, तो अवांछित इनपुट को भी ध्यान में रखा जाता है। stdinपढ़ने की कमांड जारी करने से पहले मैं कैसे स्पष्ट (या कम से कम इसे अनदेखा) करूं?


1
जब तक आप एक शाप-जैसा कार्यक्रम नहीं लिख रहे हैं, तब तक मुझे लगता है कि आप अपने कार्यक्रम में एक डिजाइन दोष होने की इच्छा रखते हैं। UNIX / Linux में बफरिंग इनपुट ("टाइप-फॉरवर्ड") की बहुत उपयोगी विशेषता है और मैं आमतौर पर इस कार्यक्षमता का उपयोग करता हूं। आपके कार्यक्रम में आ रहा है, जहाँ आप जो टाइप करते हैं उसे फेंक देते हैं, तो मैं निश्चित रूप से एक बग सबमिट करूंगा और आपके प्रोग्राम का उपयोग करना बंद कर दूंगा जब तक कि यह तय नहीं हो गया।
Arcege

1
कुछ उपयोगकर्ताओं को अपने कीबोर्ड से पियानो बजाने की आदत है, जबकि उनका कार्यक्रम कुछ करने में व्यस्त है। मैं उन कीस्ट्रोक्स को फेंकना चाहता हूं और नए सिरे से शुरू करूंगा। लेकिन आप सही हैं, "टाइप-फॉरवर्ड" उपयोगी है, लेकिन हमेशा नहीं।
रबिन

जवाबों:


8

मुझे नहीं लगता कि स्टड को साफ़ करने का एक तरीका है लेकिन (bash के साथ) आप इनपुट के लिए पूछने से पहले पढ़ सकते हैं और छोड़ सकते हैं।

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

यह स्टडिन पढ़ता है और 1 सेकंड का समय समाप्त होता है, यह विफल रहता है, अगर स्टड में 10000 से अधिक चार्ट हैं। मुझे नहीं पता कि आप नर्क्स को कितना बड़ा पैरामीटर बना सकते हैं।


मुझे वास्तव में एक मंच पर यह हैक मिला था। मैं इसे करने का एक बेहतर तरीका खोजने की उम्मीद कर रहा था। जाहिरा तौर पर नहीं।
रबिन

@ ब्रेबिन: यदि आप एक बेहतर तरीका ढूंढते हैं तो यहां वापस मैं कुछ स्क्रिप्ट में इसे प्राप्त कर सकता हूं।

दुर्भाग्य से यह सभी गोले के साथ काम नहीं करता है, जैसे पानी का छींटा :(
scai

21

बैश 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इस मामले में क्यों ?
ned

@ अब निश्चित नहीं है, शायद कुछ सिस्टम विशिष्ट समस्या को दरकिनार करने के लिए
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करने जा रहे हैं।
स्कॉट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.