जबकि थॉमस डिक्की का उत्तर काफी सही है, स्टीफन चेज़ेलस ने डिके के जवाब के लिए एक टिप्पणी में सही उल्लेख किया है कि रूपांतरण पत्थर में सेट नहीं है; यह लाइन अनुशासन का हिस्सा है।
वास्तव में, अनुवाद पूरी तरह से प्रोग्राम योग्य है।
आदमी 3 termios आदमी पेज मूल रूप से सभी प्रासंगिक जानकारी शामिल है। (लिंक लिनक्स मैन-पेज प्रोजेक्ट पर ले जाता है , जो उल्लेख करता है कि कौन सी सुविधाएँ केवल लिनक्स हैं, और जो पीओएस या अन्य प्रणालियों के लिए आम हैं; हमेशा प्रत्येक पृष्ठ पर अनुभाग के अनुरूप होने की जाँच करें ।)
iflag
टर्मिनल विशेषताएं ( old_settings[0]
में सवाल में दिखाया गया कोड में अजगर ) सभी POSIXy सिस्टम पर तीन प्रासंगिक झंडे है:
INLCR
: यदि सेट है, तो इनपुट पर NL से CR का अनुवाद करें
ICRNL
: यदि सेट (और IGNCR
सेट नहीं है), इनपुट पर सीआर को एनएल में अनुवाद करें
IGNCR
: इनपुट पर सीआर को अनदेखा करें
इसी तरह, संबंधित आउटपुट सेटिंग्स ( old_settings[1]
) भी हैं:
OPOST
: आउटपुट प्रोसेसिंग सक्षम करें।
OCRNL
: आउटपुट पर मानचित्र सीआर से एनएल।
ONLCR
: आउटपुट पर NL से CR का मैप। (XSI; सभी POSIX या एकल-यूनिक्स-विनिर्देश प्रणालियों में उपलब्ध नहीं है।)
ONOCR
: पहले कॉलम में छोड़ें (आउटपुट न करें) सीआर।
ONLRET
: छोड़ें (आउटपुट न करें) सीआर।
उदाहरण के लिए, आप tty
मॉड्यूल पर भरोसा करने से बच सकते हैं । "मेकरव" ऑपरेशन सिर्फ झंडे का एक सेट साफ करता है (और CS8
टॅलग सेट करता है ):
import sys
import termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
ch = None
try:
new_settings = termios.tcgetattr(fd)
new_settings[0] = new_settings[0] & ~termios.IGNBRK
new_settings[0] = new_settings[0] & ~termios.BRKINT
new_settings[0] = new_settings[0] & ~termios.PARMRK
new_settings[0] = new_settings[0] & ~termios.ISTRIP
new_settings[0] = new_settings[0] & ~termios.INLCR
new_settings[0] = new_settings[0] & ~termios.IGNCR
new_settings[0] = new_settings[0] & ~termios.ICRNL
new_settings[0] = new_settings[0] & ~termios.IXON
new_settings[1] = new_settings[1] & ~termios.OPOST
new_settings[2] = new_settings[2] & ~termios.CSIZE
new_settings[2] = new_settings[2] | termios.CS8
new_settings[2] = new_settings[2] & ~termios.PARENB
new_settings[3] = new_settings[3] & ~termios.ECHO
new_settings[3] = new_settings[3] & ~termios.ECHONL
new_settings[3] = new_settings[3] & ~termios.ICANON
new_settings[3] = new_settings[3] & ~termios.ISIG
new_settings[3] = new_settings[3] & ~termios.IEXTEN
termios.tcsetattr(fd, termios.TCSANOW, new_settings)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
हालांकि अनुकूलता के लिए, आप यह जांचना चाहेंगे कि क्या उन सभी स्थिरांक पहले टर्मिनस मॉड्यूल में मौजूद हैं (यदि आप गैर-पॉसिक्स सिस्टम पर चलते हैं)। आप यह भी उपयोग कर सकते हैं new_settings[6][termios.VMIN]
और new_settings[6][termios.VTIME]
यह निर्धारित करने के लिए कि क्या कोई पेंडिंग डेटा नहीं है, और कितनी देर तक रुकेगा (और पूर्णांक के पूर्णांक संख्या में)। (आमतौर पर VMIN
0 पर सेट किया जाता है, औरVTIME
0 पर अगर रीड को तुरंत वापस लौटना चाहिए, या एक पॉजिटिव नंबर पर (सेकंड का दसवां हिस्सा) कितनी देर तक रीड को सबसे ज्यादा इंतजार करना चाहिए।)
जैसा कि आप देख सकते हैं, ऊपर (और "निर्माता" सामान्य रूप से) इनपुट पर सभी अनुवाद को निष्क्रिय कर देता है, जो बताता है कि व्यवहार बिल्ली देख रही है:
new_settings[0] = new_settings[0] & ~termios.INLCR
new_settings[0] = new_settings[0] & ~termios.ICRNL
new_settings[0] = new_settings[0] & ~termios.IGNCR
सामान्य व्यवहार प्राप्त करने के लिए, बस उन तीन पंक्तियों को साफ़ करने वाली लाइनों को छोड़ दें, और "कच्चे" होने पर भी इनपुट अनुवाद अपरिवर्तित है।
new_settings[1] = new_settings[1] & ~termios.OPOST
लाइन सभी उत्पादन प्रसंस्करण अक्षम करता है, भले ही क्या अन्य उत्पादन झंडे का कहना है। आप इसे केवल आउटपुट प्रोसेसिंग को अक्षुण्ण रखने के लिए छोड़ सकते हैं। यह कच्चे मोड में भी आउटपुट "सामान्य" रखता है। (यह प्रभावित नहीं करता है कि इनपुट स्वचालित रूप से प्रतिध्वनित होता है या नहीं; यह ECHO
cflag द्वारा नियंत्रित किया जाता है new_settings[3]
।)
अंत में, जब नई विशेषताओं को सेट किया जाता है, तो कॉल सफल होगा यदि कोई हो नई सेटिंग सेट । यदि सेटिंग्स संवेदनशील हैं - उदाहरण के लिए, यदि आप कमांड लाइन पर एक पासवर्ड के लिए पूछ रहे हैं -, तो आपको नई सेटिंग्स प्राप्त करनी चाहिए, और यह सत्यापित करना चाहिए कि महत्वपूर्ण झंडे सही रूप से सेट / परेशान हैं, सुनिश्चित करने के लिए।
यदि आप अपनी वर्तमान टर्मिनल सेटिंग्स देखना चाहते हैं, तो दौड़ें
stty -a
इनपुट फ़्लैग आमतौर पर चौथी पंक्ति पर होते हैं, और -
फ़्लैग नाम के पूर्ववर्ती ध्वज के साथ आउटपुट फ़्लैग होते हैं, यदि फ़्लैग का नाम अप्रकाशित हो। उदाहरण के लिए, आउटपुट हो सकता है
speed 38400 baud; rows 58; columns 205; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
स्यूडोटर्मिनल, और USB TTY उपकरणों पर, बॉड दर अप्रासंगिक है।
यदि आप Bash स्क्रिप्ट लिखते हैं जो उदाहरण के लिए पासवर्ड पढ़ना चाहते हैं, तो निम्नलिखित मुहावरों पर विचार करें:
#!/bin/bash
trap 'stty sane ; stty '"$(stty -g)" EXIT
stty -echo -echonl -imaxbel -isig -icanon min 1 time 0
EXIT
जाल मार डाला जब भी खोल से बाहर निकल जाता है। stty -g
, स्क्रिप्ट के शुरू में टर्मिनल की वर्तमान सेटिंग्स पढ़ता है तो वर्तमान सेटिंग्स पुनर्स्थापित किए जाते हैं जब स्क्रिप्ट बाहर निकलता है, स्वचालित रूप से। आप स्क्रिप्ट को Ctrl+ के साथ बाधित भी कर सकते हैं C, और यह सही काम करेगा। (संकेतों के साथ कुछ कोने के मामलों में, मैंने पाया है कि टर्मिनल कभी-कभी कच्ची / गैर-वैज्ञानिक सेटिंग्स ( टर्मिनल में टाइप reset
+ ब्लाइंड के लिए एक की आवश्यकता होती है) के साथ फंस जाता है Enter, लेकिन stty sane
वास्तविक मूल सेटिंग्स को पुनर्स्थापित करने से पहले चलने से यह ठीक हो जाता है कि हर बार मुझे। इसीलिए यह वहां है; एक प्रकार की अतिरिक्त सुरक्षा।)
आप read
बिल्ट-इन का उपयोग करके इनपुट लाइनें (टर्मिनल से बाहर) पढ़ सकते हैं , या इनपुट चरित्र-दर-वर्ण का उपयोग करके भी पढ़ सकते हैं
IFS=$'\0'
input=""
while read -N 1 c ; do
[[ "$c" == "" || "$c" == $'\n' || "$c" == $'\r' ]] && break
input="$input$c"
done
यदि आप IFS
ASCII NUL पर सेट नहीं हैं , तो read
अंतर्निहित विभाजक का उपभोग करेंगे, ताकि c
खाली हो जाए। युवा खिलाड़ियों के लिए ट्रैप।