stdin

2016-04-24 10 views
5

को पढ़ने के लिए एक कुंजी को बाध्य करें मेरे पास एक स्क्रिप्ट है जो stdin से एक पंक्ति पढ़ती है और लाइन की सामग्री के आधार पर कुछ संचालन करती है। मुझे उस स्क्रिप्ट के लिए एक कुंजी बांधना होगा ताकि इसे Ctrl-t टाइप करके बस बुलाया जा सके। जब मैं स्क्रिप्ट को इसके नाम से कॉल करता हूं तो यह अपेक्षित काम करता है, लेकिन जब मैं कुंजी बाध्यकारी हिट करता हूं तो यह लटकता है। वास्तव में खोल लटकता है और मुझे इसे मारना है। लिपि read -r line का उपयोग करता है। मैंने cat के साथ एक ही परिणाम के साथ प्रयास किया।stdin

स्क्रिप्ट इस (फ़ाइल नाम read.sh) की तरह दिखता है:

#!/bin/bash 

echo -n ' > ' 
read -r buf 
echo "you typed $buf" 

बाइंड इस तरह: जब आप प्रेस Ctrl +टी बनाम

bind -x '"\C-t" : "read.sh"' 
+0

क्या आप ठीक से पोस्ट कर सकते हैं जो आपने कोशिश की? – andlrc

उत्तर

2

आपका टर्मिनल सेटिंग्स अलग हैं जब आप टर्मिनल के माध्यम से स्क्रिप्ट लॉन्च करते हैं। आप read.sh में निम्नलिखित पंक्ति जोड़, तो यह आपके टर्मिनल सेटिंग्स प्रिंट होगी:

echo Terminal settings: "$(stty -a)" 

अब अपने आप में स्क्रिप्ट चलाने, और फिर Ctrl +टी दबाकर उसे चलाते हैं। आपको कुछ मतभेद दिखाई देंगे, जिनमें से सबसे बड़ा -echo और -icrnl के अतिरिक्त हैं, जो गूंज को बंद करते हैं और न्यूलाइन हैंडलिंग बदलते हैं। यह फांसी स्क्रिप्ट की उपस्थिति देता है।

आप टीटी को वापस कैननिकल मोड में मजबूर कर और फिर गूंज जोड़ने के द्वारा इस समस्या को स्क्रिप्ट के अंदर ठीक कर सकते हैं। किसी भी प्रकार के बदलाव करने से पहले, आप सेटिंग्स को सहेजना और स्क्रिप्ट से बाहर निकलने पर उन्हें पुनर्स्थापित करना चाहते हैं। आप इसके लिए trap का उपयोग कर सकते हैं।

#!/bin/bash 
# Save the tty settings and restore them on exit. 
SAVED_TERM_SETTINGS="$(stty -g)" 
trap "stty \"${SAVED_TERM_SETTINGS}\"" EXIT 

# Force the tty (back) into canonical line-reading mode. 
stty cooked echo 

# Read lines and do stuff. 
echo -n ' > ' 
read -r buf 
echo "you typed $buf" 
+0

उत्कृष्ट जवाब। धन्यवाद! –