কেন কী কী ইওল পাঠায় না?


19

ইউনিক্স / লিনাক্স EOL এলএফ, লাইনফীড, হওয়া ASCII 10, পালাবার ক্রম \n

হ'ল একটি কিপ্রেস পেতে এখানে পাইথনের স্নিপেট রয়েছে:

import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
    tty.setraw(sys.stdin.fileno())
    ch = sys.stdin.read(1)
finally:
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch

আমি যখন Enterএই স্নিপেটের প্রতিক্রিয়া হিসাবে আমার কীবোর্ডে টিপব, এটি দেয় \r, ক্যারেজ রিটার্ন, এএসসিআইআই 13।

উপর উইন্ডোজ , Enterপাঠায় CR LF == 13 10। * নিক্স উইন্ডোজ নয়; কেন Enter10 এর পরিবর্তে 13 দেয় ?


দুটি বাইট পড়ার চেষ্টা করুন ।
মাইকেল হ্যাম্পটন

@ মিশেলহ্যাম্পটন নোপ, একটি বাইট পড়ার পরে সেই ফাইল বর্ণনাকারীর জন্য অপেক্ষা করার কিছুই নেই
বিড়াল

উত্তর:


11

টমাস ডিকির উত্তরটি বেশ সঠিক হলেও স্টিফেন চেজেলাস ডিকির উত্তরের একটি মন্তব্যে সঠিকভাবে উল্লেখ করেছিলেন যে রূপান্তরটি পাথরে স্থাপন করা হয়নি; এটি লাইন শৃঙ্খলার অংশ।

আসলে, অনুবাদটি সম্পূর্ণ প্রোগ্রামযোগ্য।

ম্যান 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]সেট করতেও এবং কতক্ষণ (সিদ্ধান্তের সংখ্যায় পূর্ণসংখ্যার মধ্যে) সেট করতে পারেন। (সাধারণত VMIN0 তে সেট করা থাকে, এবং VTIME0 টি যদি তাৎক্ষণিকভাবে ফিরে আসে তবে বা পজিটিভ সংখ্যায় (সেকেন্ডের দশমীতে) কতক্ষণ পড়ার সর্বাধিক অপেক্ষা করা উচিত)

আপনি দেখতে পাচ্ছেন, উপরের (এবং সাধারণভাবে "মেকেরা") ইনপুটটিতে সমস্ত অনুবাদ অক্ষম করে, যা আচরণ বিড়ালটি দেখছে তা ব্যাখ্যা করে:

    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

যদি আপনি IFSASCII NUL এ না সেট করেন তবে readঅন্তর্নির্মিত পৃথককারীদের গ্রাস করবে, তাই এটি cখালি থাকবে। তরুণ খেলোয়াড়দের জন্য ফাঁদ।


1
ওহ, দেবতাদের 'খাতিরে কিছুই হয় কি সহজ :(
বিড়াল

আমি এই উত্তরটি গ্রহণ করছি কারণ এটি পাইথন দেব হিসাবে আমার পক্ষে সবচেয়ে সহায়ক, যদিও অন্যটি দুর্দান্ত
বিড়াল

2
@ কেট: যদিও এটি আপনার পক্ষে সবচেয়ে সহায়ক হতে পারে তবুও আমি থমাস ডিকির উত্তরটি আরও সঠিক বলে দেব । আমি বরং আপনি এটি পরিবর্তে গ্রহণ করব।
নামমাত্র প্রাণী

4
আপনার +15 প্রতিনিধি ত্যাগ করার জন্য আপনার ইচ্ছাটি আপনার ক্রেডিট না থাকলেও @ বিড়ালটি বেশ সঠিক। কোনও উত্তর গৃহীত হয়েছে বা নেই তা কোনও পোস্টের উত্তরের "সবচেয়ে সঠিক" তা ইঙ্গিত দেয় না। এর কেবলমাত্র অর্থ হ'ল যে কোনও ব্যক্তিগত কারণেই ওপি পছন্দ করে। "সবচেয়ে সঠিক" সাধারণত সর্বাধিক উচ্চ আপভোট হয় oted উত্তর গ্রহণ করা ব্যক্তিগত পছন্দ অনুসারে, যদি ওপি আপনার পছন্দ করে তবে তা গ্রহণ না করার কোনও কারণ নেই।
terdon

1
@ এটারডন: ঠিক আছে, আমি ঠিক তখন দাঁড়িয়ে আছি।
নামমাত্র প্রাণী

30

মূলত "কারণ এটি ম্যানুয়াল টাইপরাইটারগুলির পরে সেভাবে করা হয়েছে"। সত্যিই।

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

বৈদ্যুতিন ডেটা এন্ট্রি (টেলি টাইপ ইত্যাদি) চালু হওয়ার সাথে সাথে তারা এটিকে এগিয়ে নিয়ে যায়। সুতরাং Enterঅনেক টার্মিনালের কী লেবেলযুক্ত হবে Return

বাম প্রান্তরে গাড়ি ফেরানোর পরে লাইন ফিডগুলি ঘটেছিল (ম্যানুয়াল প্রক্রিয়াতে)। আবার, বৈদ্যুতিন ডিভাইসগুলি ম্যানুয়াল ডিভাইসগুলি অনুকরণ করে একটি পৃথক line-feedঅপারেশন করে।

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

এখানে চিত্র বর্ণনা লিখুন

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

টার্মিনালে পাঠ্য লেখার সময় ইউনিক্স অন্য দিকে অনুবাদ করে: একটি লাইন-ফিড ক্যারেজ-রিটার্ন / লাইন-ফিডে পরিণত হয়।

(এটি, "সাধারণত": তথাকথিত "রান্না করা মোড", "কাঁচা" মোডের বিপরীতে যেখানে কোনও অনুবাদ হয় না)।

সারসংক্ষেপ:

  • ক্যারেজ-রিটার্ন / লাইন-ফিডের ক্রম 13 10
  • ডিভাইস 13 পাঠায় (যেহেতু "সব সময় প্রবেশ করুন" আপনার পদ)
  • ইউনিক্সের মতো সিস্টেমগুলি এটিকে 13 10 এ পরিবর্তন করে
  • অন্যান্য সিস্টেমগুলি অগত্যা মাত্র 10 সংরক্ষণ করে না (উইন্ডোজ মূলত কেবল 10 বা 13 10 গ্রহণ করে, নির্ভরযোগ্যতা কতটা গুরুত্বপূর্ণ তা নির্ভর করে)।

1
ম্যানুয়াল টাইপরাইটারটির জন্য লিভারগুলি দেখানোর জন্য আমি একটি সুন্দর ছবির সন্ধান করেছি, তবে কেবলমাত্র কম-রেজোলিউশন চিত্র পেয়েছি।
টমাস ডিকি

3
আপনি যদি সেগুলির মধ্যে একটিতে লিখতে চান তবে আপনি সমস্ত কিছু সংক্ষেপে সংক্ষেপে লিখবেন!
মাইকেল হ্যাম্পটন

3
ইতিহাস অংশ সংক্রান্ত: ম্যানুয়াল টাইপরাইটার আমি আমার ব্যবহার ব্যবহৃত অনুরূপ এই এক মাত্র একজন লিভার ছিল। আপনি যখন এটি টানেন, এটি প্রথমে বেলনটি (লাইন ফিড) ক্র্যাঙ্ক করেছে এবং তারপরে এটি গাড়িটি কেবল টেনে আনবে। এবং এটি এই টানই বসন্তকে বোঝায়। টাইপ করা প্রতিটি ট্যাব বা ট্যাব চাপলে বসন্তটি কিছুটা মুক্তি পেত, গাড়িটিকে "আনলোডেড" অবস্থানে ফিরিয়ে নিয়েছিল, এটি শুরু নয়, লাইনের শেষে ছিল।
রিয়েলসেকটিক

2
ইনপুট-এ, সিআর এলএফ-তে নয়, সিআরটি টিএফ-তে অনুবাদ করা হয় (টিটি লাইনের শৃঙ্খলা দ্বারা)। এটা তোলে (ইনপুট প্রতিধ্বনি সহ) আউটপুট উপর LF থেকে অনুবাদ করা হয় CR LF। আপনি যখন foo<Return>রান্না করা মোড টাইপ করেন, অ্যাপ্লিকেশনটি পড়ে foo\nএবং foo\r\nটার্মিনালে প্রতিধ্বনির জন্য লাইন শৃঙ্খলা দ্বারা ফেরত পাঠানো হয়।
স্টাফেন চেজেলাস

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