টমাস ডিকির উত্তরটি বেশ সঠিক হলেও স্টিফেন চেজেলাস ডিকির উত্তরের একটি মন্তব্যে সঠিকভাবে উল্লেখ করেছিলেন যে রূপান্তরটি পাথরে স্থাপন করা হয়নি; এটি লাইন শৃঙ্খলার অংশ।
আসলে, অনুবাদটি সম্পূর্ণ প্রোগ্রামযোগ্য।
ম্যান 3 termios man পৃষ্ঠা মূলত সব প্রাসঙ্গিক তথ্য উপস্থিত রয়েছে। (লিঙ্ক লাগে লিনাক্স মনুষ্যসৃষ্ট পৃষ্ঠাগুলি প্রকল্প , যা উল্লেখ করে যা বৈশিষ্ট্য লিনাক্স-ভিত্তিক, এবং যা POSIX বা অন্যান্য সিস্টেমের সাধারণ হয়; সবসময় পরীক্ষা অনুগ সেখানে প্রতিটি পৃষ্ঠায় অধ্যায়।)
iflag
টার্মিনাল বৈশিষ্ট্যাবলী ( old_settings[0]
প্রশ্ন দেখানো কোডে পাইথন ) সমস্ত POSIXy সিস্টেমে তিন প্রাসঙ্গিক পতাকা আছে:
INLCR
: যদি সেট করা থাকে তবে ইনপুটটিতে সিএলে এনএল অনুবাদ করুন
ICRNL
: যদি সেট করা হয় (এবং IGNCR
সেট না করা থাকে), সিআরটি এনপিকে এনপিতে অনুবাদ করুন
IGNCR
: ইনপুটটিতে সিআর উপেক্ষা করুন
একইভাবে, সম্পর্কিত আউটপুট সেটিংস ( old_settings[1]
) রয়েছে:
OPOST
: আউটপুট প্রক্রিয়াকরণ সক্ষম করুন।
OCRNL
: আউটপুট সিআর থেকে এনএল মানচিত্র।
ONLCR
: আউটপুট নেওয়ারে এনএল থেকে সিআর ম্যাপ করুন। (এক্সএসআই; সমস্ত পসিক্স বা একক-ইউনিক্স-স্পেসিফিকেশন সিস্টেমে উপলব্ধ নয়))
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
সিএফ্লেগ দ্বারা নিয়ন্ত্রিত হয় 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
সিউডোটারমিনালস এবং ইউএসবি টিটিওয়াই ডিভাইসে বাড রেট অপ্রাসঙ্গিক।
আপনি যদি বাশ স্ক্রিপ্টগুলি লিখেন যা উদাহরণস্বরূপ পাসওয়ার্ডগুলি পড়তে চান, তবে নীচের আইডিয়ামটি বিবেচনা করুন:
#!/bin/bash
trap 'stty sane ; stty '"$(stty -g)" EXIT
stty -echo -echonl -imaxbel -isig -icanon min 1 time 0
EXIT
ফাঁদ মৃত্যুদন্ড কার্যকর যখনই শেল থেকে প্রস্থান করা হয়। stty -g
, স্ক্রিপ্ট শুরুতে টার্মিনাল বর্তমান সেটিংস সার্চ তাই বর্তমান সেটিংস পুনরুদ্ধার করা হয়েছে যখন স্ক্রিপ্ট প্রস্থান করে, স্বয়ংক্রিয়ভাবে। এমনকি আপনি স্ক্রিপ্টটি বাধা দিতে পারেন Ctrl+ Cএবং এটি সঠিক কাজ করবে। (সংকেত সঙ্গে কিছু কোণ ক্ষেত্রে, আমি পেয়েছি টার্মিনাল কখনও কখনও কাঁচা / noncanonical সেটিংস (এক প্রয়োজন সঙ্গে আটকে পায় টাইপ করতে 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
খালি থাকবে। তরুণ খেলোয়াড়দের জন্য ফাঁদ।