হ্যাঁ, এর 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}
প্রক্রিয়া পুনর্নির্দেশগুলির জন্যও অপেক্ষা করে ।
bash
cmd2
এটি সাবডেলের 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
।