পটভূমি প্রক্রিয়া পাইপ-ইনপুট


14

যদি আমি স্ক্রিনে "আআ" প্রদর্শন করতে চাই:

(1)$: echo aaa | cat                 ... works OK
(2)$: echo aaa | ( cat )             ... works OK
(3)$: echo aaa | ( cat & )           ... NOT working
(4)$: ( echo aaa & ) | cat           ... works OK 
(5)$: echo aaa | ( cat <&0 & )       ... works ok in BASH (but not in SH)
(6)$: echo aaa | ( cat <&3 & ) 3<&0  ... works ok in BASH and SH

(3) এবং (4) -> বিচ্ছিন্ন প্রক্রিয়া থেকে উপসংহারে এখনও সংযুক্ত আউটপুট রয়েছে যা নিয়ন্ত্রণ, ব্যবহার, পুনঃনির্দেশিত করা যেতে পারে ... তবে ইনপুট নয়!

আমার প্রশ্নটি: কেউ কীভাবে এবং কীভাবে লাইন (5) কাজ করে তা বুঝতে পারে ???

... "<& 0" "0 <& 0" এর জন্য সংক্ষিপ্ত, কেন 0 থেকে 0 টি পুনর্নির্দেশ করা সমাধান, এবং বিচ্ছিন্ন প্রক্রিয়াটির ইনপুট সহ আসলে কী ঘটে। (...) এর পরিবর্তে ব্রেসগুলি bra ...} ব্যবহার করে একই ফলাফলগুলি সরবরাহ করা সমস্যা নয় same

... এবং প্রশ্নোত্তর 2: লাইন (6) এর চেয়ে "বিচ্ছিন্ন প্রক্রিয়াতে ইনপুট দেওয়ার" এর চেয়ে ভাল সমাধান কি আছে?

উত্তর:


12

হ্যাঁ, যেমন POSIX প্রয়োজনীয় , কমান্ড মাধ্যমে ব্যাকগ্রাউন্ডে শুরু &তাদের স্ট্যান্ডার্ড ইনপুট থেকে আপনাকে পুনঃনির্দেশিত আছে /dev/null

এবং প্রকৃতপক্ষে

{ cmd <&3 3<&- & } 3<&0

এটি চারপাশে কাজ করার সবচেয়ে সুস্পষ্ট উপায়।

যদিও আপনি পটভূমিতে পাইপলাইনের কিছু অংশ চালাতে চান তা পরিষ্কার নয়।


পাইপ চেইনের অভ্যন্তরে একটি নির্দিষ্ট কমান্ডের পিআইডি পাওয়ার কারণ ছিল (সেমিডি 1 | {সেমিডি 2 &; পিড 2 = $ !; cm | সেমিডি 3 ..., তাই / দেব / নাল == & 0 বিজি প্রসেসের জন্য মানক, আপনি কি জানেন কেন "0 <& 0"
বাশে

3
@ ওমারমারদান পোসিক্স বলেছেন যে সমস্ত ক্ষেত্রে, স্ট্যান্ডার্ড ইনপুটের স্পষ্ট পুনঃনির্দেশ এই ক্রিয়াকলাপটিকে ওভাররাইড করবে , যা এটি উপরে যা বলেছে তার বিপরীতে রয়েছে, সুতরাং আমি বিশ্বাস করি bashযে এটির /dev/nullপুনঃনির্দেশটি বাতিলকরণ হিসাবে এটি ব্যাখ্যা করে (এবং এটি একটি যুক্তিসঙ্গত ব্যাখ্যা বলে মনে হচ্ছে) । এখন, অনেকগুলি শাঁস একই রকম হয় না। ছাই এবং pdksh না।
স্টাফেন চেজেলাস

কেন এটির 3<&-অংশটি প্রয়োজন এবং এটি ব্যবহার করা নিরাপদ (সম্পূর্ণ ইনপুট পড়ার আগে এটি পাইপটি বন্ধ করবে না)?
মোরভিজেক

1
@ মুভেরিসেক, যে এফডি 3 কেবলমাত্র মূল স্টিডিনটি পুনরুদ্ধার করতে অস্থায়ীভাবে ব্যবহৃত হয়। এটি যেমন cmdপ্রয়োজন হয় না তেমন এটি বন্ধ করি। আমরা এটিকে fd 0 ( <&3ছোট করার জন্য 0<&3) এ ছুঁড়ে ফেলার পরে এটি বন্ধ করি ।
স্টাফেন চেজেলাস

1
@Mvorisek, nohupএছাড়াও, stdin / dev / নাল পুননির্দেশনা যাতে আপনি প্রয়োজন চাই: { nohup sh -c 'cmd <&3 3<&-' & } 3<&0। বা(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.