হ্যাঁ, এর bashমতো ksh(যেখানে বৈশিষ্ট্যটি আসে), প্রক্রিয়া প্রতিস্থাপনের অভ্যন্তরের প্রক্রিয়াগুলির জন্য অপেক্ষা করা হয় না (স্ক্রিপ্টে পরবর্তী কমান্ড চালানোর আগে)।
একটি জন্য <(...)এক, সাধারণত জরিমানা যে হিসাবে:
cmd1 <(cmd2)
শেলটির জন্য অপেক্ষা করা থাকবে cmd1এবং cmd1সাধারণত cmd2পাইপটিতে ফাইলের শেষ হওয়া পর্যন্ত এটি পড়ার কারণে অপেক্ষা করা হবে এবং ফাইলটি শেষের দিকে সাধারণত cmd2মারা যায় তখন ঘটে when এটি একই কারণে বেশ কয়েকটি শাঁস (না bash) cmd2ভিতরে অপেক্ষা করা বিরক্ত করে না cmd2 | cmd1।
জন্য cmd1 >(cmd2), যদিও, সাধারণভাবে মামলা, এর যেমন আরো cmd2রয়েছে যা সাধারণত জন্য অপেক্ষা cmd1পর সাধারণত থেকে প্রস্থান করা হবে তাই।
এটি সেখানে zshঅপেক্ষা cmd2করাতে স্থির হয়েছে (তবে আপনি যদি এটি লিখেন cmd1 > >(cmd2)এবং cmd1বিল্টিন না হিসাবে লিখেন তবে ডকুমেন্টের{cmd1} > >(cmd2) পরিবর্তে ব্যবহার করুন )।
kshডিফল্টরূপে অপেক্ষা না করে, তবে আপনাকে waitবিল্টিনের সাথে এটির জন্য অপেক্ষা করতে দেয় (এটি পিডটি উপলব্ধ করে তোলে $!, যদিও এটি করলে আপনি সহায়তা করেন না cmd1 >(cmd2) >(cmd3))
rc( cmd1 >{cmd2}সিনট্যাক্স সহ), একই সাথে kshআপনি সমস্ত পটভূমি প্রক্রিয়াগুলির পিডস পেতে পারেন $apids।
es(এছাড়াও সহ cmd1 >{cmd2}) cmd2পছন্দ করার zshজন্য অপেক্ষা করে cmd2এবং <{cmd2}প্রক্রিয়া পুনর্নির্দেশগুলির জন্যও অপেক্ষা করে ।
bashcmd2এটি সাবডেলের cmd2কোনও শিশু প্রক্রিয়াতে চালিত হওয়ার পরে (বা এটির শেষ কমান্ড হওয়া সত্ত্বেও সাবসেলের একেবারে হুবহু ) পাওয়া যায় $!তবে আপনাকে এটির জন্য অপেক্ষা করতে দেয় না।
যদি আপনার ব্যবহার bashকরতে হয় তবে আপনি একটি কমান্ড ব্যবহার করে সমস্যাটি সমাধান করতে পারেন যা উভয় কমান্ডের জন্য অপেক্ষা করবে:
{ { cmd1 >(cmd2); } 3>&1 >&4 4>&- | cat; } 4>&1
এটি উভয়ই করে cmd1এবং cmd2তাদের এফডি 3 পাইপের জন্য খোলা থাকে। catঅন্য প্রান্তে ফাইলের শেষের জন্য অপেক্ষা করবে, সুতরাং সাধারণত উভয়ই মারা যায় cmd1এবং cmd2মারা যায়। এবং শেলটি সেই catআদেশের জন্য অপেক্ষা করবে । আপনি দেখতে পেলেন যে সমস্ত পটভূমি প্রক্রিয়াগুলির সমাপ্তি ধরার নেট হিসাবে (আপনি এটি ব্যাকগ্রাউন্ডে শুরু হওয়া অন্যান্য জিনিসের জন্য ব্যবহার করতে পারেন যেমন &কপোকস বা এমনকি কমান্ডগুলি যে ব্যাকগ্রাউন্ড নিজেই প্রদান করেছিল তারা সাধারণত ডেমনের মতো তাদের সমস্ত ফাইল বর্ণনাকারী বন্ধ না করে) )।
নোট করুন যে উপরে উল্লিখিত নষ্ট সাবস্কেল প্রক্রিয়াটির জন্য ধন্যবাদ, এটি cmd2তার এফডি 3 বন্ধ করলেও এটি কাজ করে (কমান্ডগুলি সাধারণত এটি করে না তবে কিছু পছন্দ করে sudoবা sshকরে)। ভবিষ্যতের সংস্করণগুলি bashঅন্যান্য শেলের মতো শেষ পর্যন্ত অপ্টিমাইজেশনটি করতে পারে। তারপরে আপনার এমন কিছু প্রয়োজন হবে:
{ { cmd1 >(sudo cmd2; exit); } 3>&1 >&4 4>&- | cat; } 4>&1
F sudoকমান্ডের অপেক্ষায় এইচডি 3 ওপেন সহ এখনও একটি অতিরিক্ত শেল প্রক্রিয়া রয়েছে তা নিশ্চিত করার জন্য ।
নোট করুন যে catকিছু পড়বে না (যেহেতু প্রক্রিয়াগুলি তাদের এফডি 3 তে লেখা হয় না)। এটি সিঙ্ক্রোনাইজেশনের জন্য ঠিক আছে। এটি কেবলমাত্র একটি read()সিস্টেম কল করবে যা শেষে কিছুই না করে ফিরে আসবে।
catপাইপ সিঙ্ক্রোনাইজেশন করতে আপনি কমান্ড প্রতিস্থাপন ব্যবহার করে চালানো এড়াতে পারবেন :
{ unused=$( { cmd1 >(cmd2); } 3>&1 >&4 4>&-); } 4>&1
এবার, এটির পরিবর্তে শেলটি catপাইপটি থেকে পড়ছে যার অন্য প্রান্তটি এফডি 3 cmd1এবং এর উপর খোলা আছে cmd2। আমরা একটি পরিবর্তনশীল অ্যাসাইনমেন্ট ব্যবহার করছি যাতে এর প্রস্থান স্থিতিটি cmd1পাওয়া যায় $?।
অথবা আপনি নিজে হাতে প্রক্রিয়া প্রতিস্থাপন করতে পারেন, এবং তারপরে আপনি এমনকি আপনার সিস্টেমের ব্যবহারটি shএটি স্ট্যান্ডার্ড শেল সিনট্যাক্সে পরিণত করতে পারেন:
{ cmd1 /dev/fd/3 3>&1 >&4 4>&- | cmd2 4>&-; } 4>&1
যদিও নোট হিসাবে পূর্বে উল্লিখিত হয়েছে যে সমস্ত shবাস্তবায়ন শেষ cmd1হওয়ার পরে অপেক্ষা করবে না cmd2(যদিও এটি অন্য রাউন্ডের চেয়ে ভাল)। এই $?সময়টিতে প্রস্থান স্থিতি রয়েছে cmd2; যদিও bashএবং zshকরতে cmd1এর প্রস্থান পাওয়া অবস্থা ${PIPESTATUS[0]}এবং $pipestatus[1]যথাক্রমে (এছাড়াও দেখুন pipefailকয়েক শাঁস বিকল্পটি তাই $?গত ছাড়া অন্য পাইপ উপাদান ব্যর্থতার প্রতিবেদন করতে পারেন)
নোটটিতে yashএর প্রক্রিয়া পুনঃনির্দেশ বৈশিষ্ট্যটির সাথে একই রকম সমস্যা রয়েছে । সেখানে cmd1 >(cmd2)লেখা cmd1 /dev/fd/3 3>(cmd2)হবে। তবে এটির জন্য অপেক্ষা করা হয় না এবং আপনি এটির জন্য অপেক্ষাও cmd2করতে পারবেন না waitএবং এর পিডটি $!ভেরিয়েবলের মধ্যেও পাওয়া যায় না । আপনি প্রায় হিসাবে একই কাজ ব্যবহার করতে চাই bash।