বাশ দুটি লেখার প্রম্পট লেখার চেষ্টা করে?


11

আমি শিক্ষামূলক উদ্দেশ্যে টার্মিনালের সাথে সংযুক্ত একটি চলমান বাশ প্রক্রিয়াটির স্ট্রেস আউটপুটটি দেখছি।

আমার বাশ প্রক্রিয়াটির পিআইডি 2883 রয়েছে।

আমি টাইপ

[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace

টার্মিনালে nto আমি তখন আমার বাশ প্রক্রিয়াতে যাই এবং নিম্নলিখিত ইন্টারঅ্যাকশন করি:

[OP@localhost ~]$ ls

আউটপুট তাকিয়ে, আমি দেখতে

strace: Process 2883 attached
read(0, "l", 1)                         = 1
write(2, "l", 1)                        = 1
read(0, "s", 1)                         = 1
write(2, "s", 1)                        = 1
read(0, "\r", 1)                        = 1
write(2, "\n", 1)                       = 1
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec6b1d8e50) = 3917
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "\33]0;OP@localhost:~\7", 23) = 23
write(2, "[OP@localhost ~]$ ", 22)  = 22
...

আমি শেষ দুটি লাইনে বিভ্রান্ত হয়ে পড়েছি। মনে হচ্ছে বাশ দুটি শেল প্রম্পট লেখার চেষ্টা করছে? এখানে কি হচ্ছে?

উত্তর:


24

<ESC>]0;ক্রম (হিসাবে দেখানো \33]0;strace, দ্বারা) টার্মিনাল উইন্ডোর শিরোনাম সেট করতে পালাবার ক্রম। এটি বিইএল চরিত্রের ( \7) দিয়ে সমাপ্ত হয় , সুতরাং প্রথমটি writeউইন্ডো শিরোনাম সেট করে। দ্বিতীয়টি প্রকৃত প্রম্পট প্রিন্ট করে। মনে রাখবেন যে এমনকি পালানোর ক্রমটি বাদে, তারা ঠিক এক রকম নয়। [..]উইন্ডো শিরোনাম না থাকলে প্রম্পটের চারপাশে রয়েছে ।

আমরা আরও দেখতে পাচ্ছি যে প্রথম লেখাটি স্টাডাউটে যায় (এফডি 1, প্রথম যুক্তিটি write()), এবং দ্বিতীয়টি স্টার্ডারে যায়। বাশ স্টাডারকে প্রম্পট প্রিন্ট করে, তাই প্রথম লেখাটি অন্য কোথাও থেকে আসে। এটি কোথাও সম্ভবত PROMPT_COMMANDবাশের জন্য ডেবিয়ান ডিফল্ট স্টার্টআপ স্ক্রিপ্টগুলির মতো। এখানে এরকম কিছু রয়েছে:

case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
    ;;
*)
    ;;
esac

এটি নির্ধারণ করে যে PROMPT_COMMANDচলমান xtermবা যদি rxvt, যা চালানো ক্রমটিকে সমর্থন করে।


আপনি কি জানেন যে বাশ কেন একবারে লাইনে না পড়ার চেয়ে চরিত্র অনুসারে জিনিসগুলি অক্ষরগুলি পড়তে দেখা যায়? এছাড়াও, বাশ কেন স্ট্যান্ডআউটে "এল" এবং "এস" লিখবে? আমি যদি এর সাথে একই ধরণের স্ট্রেস catকরি তবে দুটি পার্থক্য রয়েছে: এটি লাইন দ্বারা ইনপুট লাইনটি পড়ে, এবং এটি যখন তার ইনপুটটি স্টডআউটের কাছে প্রতিধ্বনিত করে, আমি ইনপুটটি দু'বার দেখি (একবার আমি টাইপ করার পরে এবং একবার বিড়াল যখন প্রতিধ্বনিত হয়)।
চূড়ান্তভাবে 5

@ চূড়ান্তক্ষেত্র 5, এটি মূলত কারণ বাশ (বা বরং রিডলাইন লাইব্রেরি) সমস্ত কমান্ড লাইন প্রসেসিং নিজেই পরিচালনা করে, পরিবর্তে টার্মিনালের দ্বারা করা সীমিত প্রসেসিংয়ের উপর নির্ভর করে। যখন কোনও ট্যাব অক্ষর বা ^A(Ctrl-A) বা বিভিন্ন বিশেষ অক্ষর চাপা থাকে তখন কী করা উচিত তা অবিলম্বে ইনপুটটি পেতে হবে । এছাড়াও, এটি টার্মিনালের প্রতিধ্বনি বন্ধ করে দেয়, যাতে প্রতিটি নির্দিষ্ট ইনপুট চরিত্রের জন্য কী আউটপুট করা যায় তা সিদ্ধান্ত নিতে পারে (আবার, ট্যাব সাধারণত কোনও টিএবি আউটপুট দেয় না)) catএর কিছুই করে না। যদি এটি হয় তবে চালানোর চেষ্টা করুন dash, যা কোনও কমান্ড লাইন হ্যান্ডলিং করে না।
ইলকচাচু

প্রকৃতপক্ষে, বাশ read()একবারে কেবল একটি বাইট পড়তে বলার কারণ হ'ল এটি কোনও নতুন লাইনের অতীতে পড়তে পারে না। নতুন লাইনের ফলে এটি কোনও বহিরাগত প্রোগ্রাম চালুর কারণ হতে পারে যা একই ইনপুট থেকেও পড়তে পারে। (এবং সেই প্রোগ্রামটি নতুন লাইনের পরে কোনও অক্ষর পড়তে সক্ষম হওয়া উচিত)) যদি এটির যত্ন না নেওয়া হয় তবে এটি read()একটি বৃহত্তর সীমাতে এবং কাঁচা মোডে টার্মিনাল সহ কল করতে পারে তবে এটি সাধারণত ইনপুটটি পেতে পারে একবারে একটি চরিত্র। (ইনপুট অক্ষরগুলি কত দ্রুত আসবে এবং প্রক্রিয়াটি কীভাবে নির্ধারিত হয়েছিল তা
অবাক হবে

আপনার দ্বিতীয় মন্তব্যটি কেবল সত্য বলে মনে হচ্ছে কারণ বাশ কমান্ড-লাইন নিজেই পরিচালনা করে।
চূড়ান্তভাবে 5

@ চূড়ান্তরূপে 5, ভাল, হ্যাঁ, আমি ধরেই নিয়েছিলাম, যেহেতু এটি সাধারণ ঘটনা। তবে, শেলটি যদি টার্মিনালের লাইন সম্পাদনার উপর নির্ভর করে, সময়সীমা এখনও একটি সমস্যা হতে পারে। যদি দুটি লাইন দ্রুত উত্তরাধিকারসূত্রে প্রেরণ করা হয় (ডেটা পেস্ট করার কথা ভাবেন), এবং সিস্টেমটি যথেষ্ট পরিমাণে লোড করা হয়েছিল যাতে শেলটি তত্ক্ষণাত নির্ধারিত না হয়ে (বা আরও খারাপ, শেলটি বন্ধ করা হয়েছিল), তবে read()বৃহত্তর বাফার সহ একটি লাইন এখনও দুটি লাইনে ফিরে আসতে পারে একই কল। আমি গ্যারান্টি যে আছে তা মনে করি না read()হবে সবসময় রান্না মোডে মাত্র এক লাইন ফিরে যান।
ilkkachu
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.