কেন সিটিআরএল-ডি (ইওএফ) শেল থেকে প্রস্থান করবে?


68

আপনি কি এই পালানোর ধারাটি ইনপুট করে আক্ষরিক অর্থে "একটি ফাইলের সমাপ্তি" করছেন, অর্থাত্ ইন্টারেক্টিভ শেল সেশনটি অন্য ফাইল স্ট্রিমের মতো শেল দ্বারা একটি সত্যিকারের ফাইল স্ট্রিম হিসাবে দেখা যায়? যদি তাই হয়, কোন ফাইল?

অথবা, Ctrl+ Dসিগন্যালটি কি কেবল কোনও স্থানধারক যার অর্থ "ব্যবহারকারী ইনপুট সরবরাহ শেষ করেছেন এবং আপনি শেষ করতে পারেন"?



6
এফওয়াইআই, বাশে আপনি set -o ignoreeofসেই আচরণটি পরিবর্তন করতে পারেন ।
কীথ

আমারও একই সমস্যা ছিল। আমার ত্রুটিটি ছিল যে আমি ঘটনাক্রমে কনসোল প্রোফাইল শর্টকাটকে "Ctrl + d" এ নিয়োগ করেছি। আমার গর্বের মুহূর্ত নয়।
ব্রায়ান সায়মনসন

উত্তর:


78

^Dঅক্ষর (নামেও পরিচিত \04বা 0x4, সংক্রমণ END টি ইউনিকোড মধ্যে) জন্য ডিফল্ট মান eofকার্নেল টার্মিনাল বা সিউডো-টার্মিনাল চালকের বিশেষ নিয়ন্ত্রণ চরিত্র প্যারামিটার (আরো সঠিকভাবে এর ttyসিরিয়াল বা ছদ্ম- সংযুক্ত লাইন শৃঙ্খলা tty ডিভাইস )। এটা c_cc[VEOF]এর termiosগঠন TCSETS প্রেরণ / TCGETS ioctlটার্মিনাল ডিভাইসে এক বিষয় চালক আচরণকে প্রভাবিত করার।

টিপিক্যাল কমান্ড যা সেগুলি প্রেরণ করে তা ioctlsহ'ল sttyকমান্ড।

সমস্ত পরামিতি পুনরুদ্ধার করতে:

ty stty -a
গতি 38400 বাউড; সারি 58; কলাম 191; লাইন = 0;
আন্ত = ^ সে; ছাড়ুন = ^ \; মুছে ফেলুন = ^ ?; হত্যা = ^ ইউ; eof = ^ D ; eol = <undef>; eol2 = <undef>; swtch = <undef>; শুরু = = প্রশ্ন; স্টপ = ^ এস; সাসপ = ^ জেড; rprnt = ^ R; werase = ^ ডাব্লু; lnext = ^ V; ফ্লাশ = ^ হে;
মিনিট = 1; সময় = 0;
-প্যারেনব-পারোড্ড সিএস 8 -হুপসিএল -সিসটপবি ক্র্যাড -ক্লোকাল -ক্রটস্কটস
-ignbrk-brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
ওপোস্ট -লকুক-ওসিএনএনএল-সিএনআর -অনোক্র-ওনলরেট -ফিল-এনডিএল 0 cr0 ট্যাব বিএস 0 ভিটি0 এফএফ0
আইসিগ আইকনন ইক্সটেন ইকো ইকো ইকোক -চোনল -নফ্ল্যাশ-এক্সেসস-টোস্টপ -চোপ্র্ট ইকোক্টল ইকোক

যে eofযখন টার্মিনাল ডিভাইস রয়েছে প্যারামিটার শুধুমাত্র প্রাসঙ্গিক icanonমোড।

এই মোডে, টার্মিনাল ড্রাইভার (টার্মিনাল এমুলেটর নয়) একটি খুব সাধারণ লাইন সম্পাদক প্রয়োগ করে , যেখানে আপনি Backspaceকোনও অক্ষর Ctrl-Uমুছতে, পুরো লাইনটি মুছতে টাইপ করতে পারেন ... যখন অ্যাপ্লিকেশন টার্মিনাল ডিভাইস থেকে পড়ে, তখন পর্যন্ত এটি কিছুই দেখতে পায় না আপনি টিপুন Returnযে বিন্দুতে read()শেষ LFঅক্ষর সহ পুরো লাইনটি ফিরে আসে (ডিফল্টরূপে, টার্মিনাল ড্রাইভারটি CRআপনার টার্মিনালের দ্বারা প্রেরিতকে অনুবাদ করে ) ReturntoLF

এখন, আপনি এখন পর্যন্ত কী টাইপ করেছেন তা যদি চাপ না দিয়ে প্রেরণ করতে চান, তবে Enterসেখানেই আপনি eofচরিত্রটি প্রবেশ করতে পারবেন । টার্মিনাল এমুলেটর থেকে এই চরিত্রটি পাওয়ার পরে, টার্মিনাল ড্রাইভার লাইনের বর্তমান সামগ্রী জমা দেয়, যাতে এতে করা অ্যাপ্লিকেশনটি সেটিকে readযেমনটি গ্রহণ করবে (এবং এতে কোনও পিছনে LFঅক্ষর থাকবে না )।

এখন, যদি বর্তমান লাইনটি খালি থাকে, এবং সরবরাহিত অ্যাপ্লিকেশনটি পূর্বে প্রবেশ করা লাইনগুলি পুরোপুরি পড়তে পারে তবে, read0 টি অক্ষর ফিরে আসবে।

এটি অ্যাপ্লিকেশনটিতে ফাইলের সমাপ্তি নির্দেশ করে (আপনি যখন কোনও ফাইল থেকে পড়েন, তখন পড়ার মতো আরও কিছু না পাওয়া পর্যন্ত আপনি পড়েন)। এ কারণেই এটিকে eofচরিত্র বলা হয় , কারণ এটি প্রেরণের ফলে অ্যাপ্লিকেশনটি দেখতে পায় যে আর কোনও ইনপুট উপলব্ধ নেই।

এখন, আধুনিক শেলগুলি তাদের প্রম্পটে টার্মিনালটি icanonমোডে সেট করে না কারণ তারা তাদের নিজস্ব লাইন সম্পাদক বাস্তবায়িত করে যা একটি অন্তর্নির্মিত টার্মিনাল ড্রাইভারের চেয়ে অনেক উন্নত। যাইহোক, তাদের নিজস্ব লাইন সম্পাদকটিতে , ব্যবহারকারীদের বিভ্রান্ত না করার জন্য, তারা ^Dঅক্ষরটি (বা কিছুতে টার্মিনালের eofসেটিংস যা কিছু রয়েছে) একই অর্থ দেয় (বোঝাতে eof)।


আমি জানতাম একবার আমি এই মন্তব্যটি পড়া শুরু করেছিলাম যে এটি স্টিফেন লিখেছেন :) আপনি, স্টিফেন, আমার বাশ নায়ক, এবং আমি ব্যঙ্গাত্মক হয়ে উঠছি না। আমি আপনার সাথে মধ্যাহ্নভোজ করতে এবং আপনার ব্রেইন পছন্দ করতে চাই আপনি যদি কখনও এনওয়াইসিতে থাকেন তবে আমি কিনছি।
গ্রেগ লেভেন্টাল

@GreggLeventhal। ধন্যবাদ। আমার যে কোনও সময় শীঘ্রই এনওয়াইসি যাওয়ার সম্ভাবনা যদিও বেশ পাতলা।
স্টাফেন চেজেলাস

এটি EOT এমনকি 7-বিট ASCII
বনাঙ্গুইনে

9

সিটিআরএল_ডি এটি কেবল একটি সংকেত বলে যে এটি কোনও পাঠ্য প্রবাহের সমাপ্তি। আপনি এটি দিয়ে কোনও ফাইল শেষ করবেন না, আপনি এটি লিখে টাইপ করে আপনার ইনপুট স্ট্রিমটি শেষ করবেন। এছাড়াও হ্যাক্সডাম্প সরঞ্জামটির সাহায্যে সিটিআরএল_ডি কোনও চরিত্র বা বাইটের পক্ষে দাঁড়ায় না:

# cat >test.txt
asdf# hexdump -C test.txt 
00000000  61 73 64 66                                       |asdf|
00000004
# ll test.txt 
-rw-r--r-- 1 root root 4 Jan 21 11:55 test.txt

5
এবং এটি শেলটি শেষ করার কারণ হ'ল শেলটি মূলত একটি প্রক্রিয়া যা ইনপুট গ্রহণ করে এবং এটি দিয়ে স্টাফ করে। যখন আপনি এটি বলবেন যে আর কোনও ইনপুট আসবে না, তখন শেলের জন্য আর কিছুই করার নেই।
জেনি ডি

আমি বুঝতে পারি যে ইওএফ সিকোয়েন্সটি একটি পাঠ্য ফাইল দ্বারা বলা, নেই, এবং ওএসের দ্বারা জেনারেট হয়েছে যে পড়ার মতো আরও কোনও ডেটা নেই report আমি মনে করি আমি সত্যিই যা জিজ্ঞাসা করছি তা যদি ইন্টারেক্টিভ টার্মিনাল সেশনটি অন্য কোনও ফাইল স্ট্রিমের মতো শেল দ্বারা একটি বাস্তব ফাইল স্ট্রিম হিসাবে দেখা যায়।
গীব

সুনির্দিষ্ট করার জন্য কেবল আসল প্রশ্নটি সম্পাদনা করা হয়েছে।
গীব

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