আপনি জানেন, আমি নিশ্চিত নই যে আপনার ডায়াগ্রামগুলি চিত্রিত করার কারণে আপনার অবশ্যই পুনরাবৃত্তিমূলক প্রতিক্রিয়া লুপের প্রয়োজন হবে, যতটা সম্ভবত আপনি কোপ্রোসেসের মধ্যে একটি অবিরাম পাইপলাইন ব্যবহার করতে পারেন । তারপরে আবার, এটি খুব বেশি পার্থক্য নাও করতে পারে - একবার আপনি যদি কোনও কোপ্রোসেসিতে কোনও লাইন খোলেন আপনি সাধারণ স্টাইলের লুপগুলি কেবল তথ্য লেখার জন্য এবং সাধারণের বাইরে খুব কিছু না করেই তথ্য পড়তে পারেন implement
প্রথম স্থানে, এটি প্রদর্শিত হবে যে bc
এটি আপনার জন্য একজন কপোক্রেসির প্রধান প্রার্থী। ইন bc
আপনি যা করতে পারেন define
ফাংশন যে আপনার pseudocode মধ্যে জন্য প্রায় কাছাকাছি কি আপনি জিজ্ঞাসা করতে পারেন। উদাহরণস্বরূপ, এটি করার জন্য কিছু খুব সাধারণ ক্রিয়াকলাপ এর মতো দেখতে পারে:
printf '%s()\n' b c a |
3<&0 <&- bc -l <<\IN <&3
a=1; b=0; c=0;
define a(){ "a="; return (a = c+1); }
define b(){ "b="; return (b = 3*a); }
define c(){ "c="; return (c = s(b)); }
IN
... যা মুদ্রণ করবে ...
b=3
c=.14112000805986722210
a=1.14112000805986722210
তবে অবশ্যই এটি স্থায়ী হয় না । printf
এর পাইপ প্রস্থান ছাড়ারprintf
a()\n
দায়িত্বে থাকা শিগগিরই ( পাইপকে লেখার ঠিক পরে ) পাইপটি ছিঁড়ে ফেলা হয় এবং bc
এর ইনপুট বন্ধ হয়ে যায় এবং এটিও প্রস্থান করে। এটি যতটা কার্যকর হতে পারে তেমন কার্যকর নয়।
ইউডারলিটি ইতিমধ্যে ইউটিলিটি সহ একটি নামযুক্ত পাইপ ফাইল তৈরি করে ফিফোর কথা উল্লেখ করেছে । এগুলি মূলত কেবল পাইপগুলিই রয়েছে, সিস্টেম কার্নেল উভয় প্রান্তের সাথে একটি ফাইল সিস্টেম প্রবেশের লিঙ্ক দেয়। এগুলি খুব কার্যকর, তবে ফাইল সিস্টেমে ঝুঁকিপূর্ণভাবে ঝুঁকি না নিয়ে যদি আপনি কেবল পাইপটি পেতে পারেন তবে এটি খুব ভাল।mkfifo
এটি হওয়ার সাথে সাথে, আপনার শেলটি এটি অনেক কিছু করে। আপনি যদি এমন শেল ব্যবহার করেন যা প্রক্রিয়া প্রতিস্থাপনের প্রয়োগ করে তবে আপনি দীর্ঘস্থায়ী পাইপ প্রাপ্তির খুব সোজা উপায় আছে - আপনি যে ধরনের পটভূমি প্রক্রিয়ায় যে বিষয়টি দিয়ে আপনি যোগাযোগ করতে পারেন তা নির্ধারণ করতে পারেন।
ইন bash
, উদাহরণস্বরূপ, কেমন প্রক্রিয়া প্রতিকল্পন কাজ দেখতে পারেন:
bash -cx ': <(:)'
+ : /dev/fd/63
আপনি দেখতে পাচ্ছেন যে এটি আসলে একটি প্রতিস্থাপন । শেল সম্প্রসারণ করার সময় একটি মান কর্মের পরিবর্তে একটি পাথ সাথে সঙ্গতিপূর্ণ লিংক একটি থেকে নল । আপনি এর সদ্ব্যবহার করতে পারেন - ()
প্রতিস্থাপনের মধ্যে যা কিছু প্রক্রিয়া চলে তার সাথে যোগাযোগ করার জন্য আপনাকে কেবল সেই পাইপটি ব্যবহার করতে বাধা দেওয়া হবে না ...
bash -c '
eval "exec 3<>"<(:) "4<>"<(:)
cat <&4 >&3 &
echo hey cat >&4
read hiback <&3
echo "$hiback" here'
... যা ছাপায় ...
hey cat here
এখন আমি জানি যে বিভিন্ন শাঁস বিভিন্ন উপায়ে কোপ্রোসেস জিনিসটি করে - এবং এটি bash
স্থাপনের জন্য একটি নির্দিষ্ট বাক্য গঠন রয়েছে (এবং সম্ভবত এটির জন্য একটিও zsh
রয়েছে) - তবে কীভাবে এই জিনিসগুলি কাজ করে তা আমি জানি না। আমি শুধু জানি তুমি উভয় অনর্থক সব ছাড়া কার্যত একই জিনিস করে উপরে সিনট্যাক্স ব্যবহার করতে পারেন bash
এবং zsh
- এবং আপনি একটি অনুরূপ জিনিস করতে পারেন dash
এবং busybox ash
এখানে-নথি সঙ্গে একই উদ্দেশ্য অর্জনের জন্য (কারণ dash
এবং busybox
এখানে- না অন্যান্য দু'জনের মতো টেম্প-ফাইলের চেয়ে পাইপযুক্ত নথি) ।
সুতরাং, যখন প্রয়োগ করা হয় bc
...
eval "exec 3<>"<(:) "4<>"<(:)
bc -l <<\INIT <&4 >&3 &
a=1; b=0; c=0;
define a(){ "a="; return (a = c+1); }
define b(){ "b="; return (b = 3*a); }
define c(){ "c="; return (c = s(b)); }
INIT
export BCOUT=3 BCIN=4 BCPID="$!"
... এটা শক্ত অংশ। এবং এটি মজার অংশ ...
set --
until [ "$#" -eq 10 ]
do printf '%s()\n' b c a >&"$BCIN"
set "$@" "$(head -n 3 <&"$BCOUT")"
done; printf %s\\n "$@"
... যা ছাপায় ...
b=3
c=.14112000805986722210
a=1.14112000805986722210
#...24 more lines...
b=3.92307618030433853649
c=-.70433330413228041035
a=.29566669586771958965
... এবং এটি এখনও চলছে ...
echo a >&"$BCIN"
read a <&"$BCOUT"
echo "$a"
... যা শুধু আমার জন্য সর্বশেষ মান পায় bc
'র a
বরং কলিং চেয়ে a()
এটি এবং কপি করে প্রিন্ট বাড়াতে ফাংশন ...
.29566669586771958965
এটি চালিয়ে যেতে থাকবে, আসলে, যতক্ষণ না আমি এটিকে হত্যা করব এবং এর আইপিসি পাইপগুলি ছিন্ন করব না ...
kill "$BCPID"; exec 3>&- 4>&-
unset BCPID BCIN BCOUT