বাশ কীভাবে আচরণ করে ">> ()"


9

আউটপুট পুনঃনির্দেশ এবং প্রক্রিয়া বিকল্পের সাথে পরীক্ষা করার সময় আমি নিম্নলিখিত কমান্ড এবং এর ফলে প্রাপ্ত আউটপুটটির উপর হোঁচট খেয়েছি:

    আমি @ এলেম: ~ cho ইকো ফু>> (বিড়াল); প্রতিধ্বনি বার
    বার
    আমি @ এলেম: ~ $ ফু

(হ্যাঁ, শেষে খালি নিউলাইনটি ইচ্ছাকৃত)

সুতরাং বাশ প্রতিধ্বনি বার, আমার প্রম্পট প্রিন্ট করে, প্রতিধ্বনি এর foo, প্রতিধ্বনি একটি নতুন লাইন, এবং আমার কার্সার সেখানে রেখে। যদি আমি আবার প্রবেশ করায় আঘাত করি তবে এটি আমার প্রম্পটটি একটি নতুন লাইনে মুদ্রণ করবে এবং কার্সারটিকে অনুসরণ করে ছেড়ে দেবে (প্রত্যাশা অনুযায়ী যখন কোনও খালি কমান্ড লাইনে প্রবেশ করে) enter

আমি প্রত্যাশা করছিলাম এটি কোনও ফাইল বর্ণনাকারীতে ফু লিখবে, বিড়াল এটি পড়বে এবং প্রতিধ্বনি এর ফু, দ্বিতীয় প্রতিধ্বনির বার এবং তারপরে কমান্ড প্রম্পটে ফিরে আসবে। তবে এটি স্পষ্টভাবে কেস নয়।

কেউ কি দয়া করে ব্যাখ্যা করতে পারেন যে কি চলছে?


আমি এর উপর উত্তরগুলি খুঁজতে পরামর্শ দিতে চাই: unix.stackexchange.com/questions/182800/… এটি দ্বৈত পুনঃনির্দেশের ব্যাখ্যা দেয় এবং আপনি কেন বিভিন্ন ফলাফলের সাথে শেষ করছেন তা ব্যাখ্যা করবে। মুরু এবং মাইকেল হরমার উভয়ই।
সময় নেই

একটি প্রশ্ন স্পষ্টভাবে কেন প্রক্রিয়া প্রতিকল্পন আউটপুট মোকাবেলার জন্য প্রম্পট পরে প্রদর্শিত হবে বোর্ন আবার শেল এর কিছু সংস্করণগুলিতে (এবং কিছু পরিস্থিতিতে আদৌ মনে হয় না), দেখতে unix.stackexchange.com/questions/471987
JdeBP

উত্তর:


9

টাইমিংয়ের উপর নির্ভর করে আপনি প্রম্পটের fooআগে bar, পরে barবা এমনকি প্রদর্শিত হতে পারে । সামঞ্জস্যপূর্ণ সময় পেতে কিছুটা বিলম্ব যুক্ত করুন:

$ echo foo > >(sleep 1; cat); echo bar; sleep 2 
bar
foo
$

barতত্ক্ষণাত্ উপস্থিত হয়, তারপরে fooএক সেকেন্ডের পরে, তারপরে পরবর্তী সেকেন্ডের পরের প্রম্পট।

যা ঘটছে তা হ'ল বাশ পটভূমিতে প্রক্রিয়া বিকল্পগুলি কার্যকর করে।

  1. প্রধান বাশ প্রক্রিয়াটি কার্যকর করার জন্য একটি সাবশেল শুরু করে sleep 1; catএবং এটিতে একটি পাইপ সেট আপ করে।
  2. মূল বাশ প্রক্রিয়া সম্পাদন করে echo foo। যেহেতু এটি পাইপের বাফারটি পূরণ করে না, তাই echoকমান্ডটি ব্লক না করেই শেষ করে।
  3. মূল বাশ প্রক্রিয়া সম্পাদন করে echo bar
  4. প্রধান বাশ প্রক্রিয়া কমান্ড আরম্ভ করে sleep 2
  5. ইতিমধ্যে সাবশেল কমান্ডটি চালু করছে sleep 1
  6. প্রায় 1 সেকেন্ড পরে, sleep 1সাবপ্রসেসে ফিরে আসে। সাব-প্রসেসটি কার্যকর করতে এগিয়ে যায় cat
  7. cat এর ইনপুটটিকে এর আউটপুট অনুলিপি করে (যা স্ক্রিনে প্রদর্শিত হয়) এবং ফিরে আসে।
  8. সাবশেলটি তার কাজ শেষ করেছে, এটি প্রস্থান করে।
  9. আর এক সেকেন্ড পরে, sleep 2ফিরে আসে। প্রধান শেল প্রক্রিয়া সম্পাদন শেষ করে এবং আপনি পরবর্তী প্রম্পটটি দেখতে পাবেন।

3

প্রভাবটি পেতে আপনার প্রক্রিয়া বিকল্পের দরকার নেই। এটা চেষ্টা কর:

( echo foo | cat & )

আপনি একই ফলাফল পাবেন (ছাড়া bar; আমি এটিকে একটি অনুশীলন হিসাবে ছেড়ে দেব) এবং একই কারণে। উভয় ক্ষেত্রেই catব্যাকগ্রাউন্ড টাস্ক হিসাবে শুরু করা হয়। আমার লাইনে এখানে, এটি স্পষ্ট। প্রক্রিয়া প্রতিস্থাপনের ক্ষেত্রে এটিও স্পষ্ট - এটি একটি পৃথক প্রক্রিয়া যা নাম ফাইল বর্ণনাকারীর সাথে সংযুক্ত - তবে এটি সম্ভবত এতটা সুস্পষ্ট নয়।

bashপরবর্তী প্রম্পট প্রিন্ট করার আগে শিশু প্রক্রিয়া অগত্যা শেষ হবে না । এবং এর আউটপুটটি বাফার হওয়ার কারণে এটি শেষ না হওয়া অবধি কোনও কিছুই আউটপুট দেয় না। এই মুহুর্তে, ব্যাশ সবেমাত্র $স্ট্ডার-এ মুদ্রিত হয়েছে, এবং এখন পটভূমি প্রক্রিয়া মুদ্রণ fooএবং একটি নতুন লাইন পরে প্রস্থান করে ।

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