আপনি যেটি সম্পাদনের চেষ্টা করছেন তার পদটি হ'ল মাল্টিপ্লেক্সিং ।
এটি ব্যাশে মোটামুটি সহজেই সম্পন্ন করা যায় তবে এর জন্য আরও কিছু উন্নত বাশ বৈশিষ্ট্য প্রয়োজন।
আমি আপনার উপর ভিত্তি করে একটি স্ক্রিপ্ট তৈরি করেছি যা আমি মনে করি আপনি যা করতে চেষ্টা করছেন তা করে। আমি এটি নীচে ব্যাখ্যা করব।
#!/bin/bash
manager() {
while IFS= read -r line; do
echo "manager[$1:$BASHPID]: $line"
done
}
fds=()
for (( i=0; i<5; i++ )); do
exec {fd}> >(manager $i)
fds+=( $fd )
done
while IFS= read -r line; do
echo "master: $line"
for fd in "${fds[@]}"; do
printf -- '%s\n' "$line" >&$fd
done
done
managerএটি একটি বাশ ফাংশন যা কেবল STDIN থেকে পড়ে এবং এটি সনাক্তকারী এবং লাইনটি STDOUT এ লিখে দেয়। আমরা ব্যবহার $BASHPIDপরিবর্তে $$যেমন $$subshells জন্য আপডেট না (যা আমরা আরম্ভ করার জন্য ব্যবহার করা হবে manager।
fdsএমন একটি অ্যারে যা বিভিন্ন ফাইলের এসটিডিআইএন পাইপগুলিকে নির্দেশ করে ফাইল বর্ণনাকারীদের ধরে রাখবে manager।
তারপরে আমরা লুপ করি এবং 5 টি ম্যানেজার প্রক্রিয়া তৈরি করি। for (( ))আপনি এটি যেভাবে পরিষ্কার করছেন সেটির পরিবর্তে আমি সিনট্যাক্সটি ব্যবহার করি । এটি বাশ সুনির্দিষ্ট, তবে এই স্ক্রিপ্টটি বেশ কয়েকটি কাজ বিশেষভাবে নির্দিষ্ট করে বশ।
পরবর্তী আমরা পেতে exec {fd}> >(manager $i)। এটি আরও বেশ কয়েকটি বাশ নির্দিষ্ট জিনিস করে।
যার প্রথমটি হচ্ছে {fd}>। এটি 10 নম্বর বা তার পরে পরবর্তী উপলব্ধ ফাইল বর্ণনাকারীটিকে ধরে ফেলবে, সেই ফাইলের বর্ণনাকারীকে নির্ধারিত পাইপের রাইটিং পাশের সাথে একটি পাইপ খুলবে এবং ভেরিয়েবলের জন্য ফাইল বর্ণনাকারী নম্বরটি বরাদ্দ করবে $fd।
>(manager $i)লঞ্চ manager $iএবং মূলত পরিপূরক >(manager $i)যে প্রক্রিয়ার একটি stdin করার জন্য একটি পাথ উল্লেখ করুন। সুতরাং যদি managerপিআইডি 1234 হিসাবে চালু করা হয়, তবে এটি >(manager $i)বিকল্প হিসাবে পেতে পারে /proc/1234/fd/0(এটি ওএস নির্ভর)।
সুতরাং, পরবর্তী উপলব্ধ ফাইল বর্ণনাকারী সংখ্যাটি 10 হিসাবে ধরে নেওয়া এবং ম্যানেজারটি পিআইডি 1234 দিয়ে চালু করা হয়, কমান্ডটি exec {fd}> >(manager $i)মূলত হয়ে যায় exec 10>/proc/1234/fd/0এবং ব্যাশের এখন সেই ফাইল ব্যবস্থাপকটি সেই ব্যবস্থাপকের এসটিডিআইএনকে নির্দেশ করে।
তারপরে যেহেতু বাশ সেই ফাইলের বর্ণনাকারী নম্বরটি রাখে $fd, আমরা সেই বর্ণনাকারীকে fdsপরবর্তী ব্যবহারের জন্য অ্যারেতে যুক্ত করব ।
এটির বাকিগুলি বেশ সহজ। মাস্টার STDIN থেকে একটি লাইন পড়েন, সমস্ত ফাইল বর্ণনাকারীর উপরে পুনরাবৃত্তি করে $fdsএবং সেই ফাইলটি ডিজিসিপ্টারে ( printf ... >&$fd) লাইনটি প্রেরণ করেন ।
ফলাফলটি এরকম দেখাচ্ছে:
$ /tmp/test.sh
hello
master: hello
manager[0:8876]: hello
manager[1:8877]: hello
manager[4:8880]: hello
manager[2:8878]: hello
manager[3:8879]: hello
world
master: world
manager[0:8876]: world
manager[1:8877]: world
manager[3:8879]: world
manager[2:8878]: world
manager[4:8880]: world
যেখানে আমি টাইপ করেছি helloএবং world।