একটি কমান্ড দুটি পাইপ


9

আমি নিম্নলিখিত সিনট্যাক্স দ্বারা সামান্য বিভ্রান্ত। যদিও এটি কাজ করে, এটি কেন কাজ করে তা বুঝতে পারে না। মনে হচ্ছে ডিফ কমান্ডের সাথে দুটি পাইপ সংযুক্ত আছে। তবে সেখানে কি একটাই নেই STDIN?

উদাহরণ:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

এখানে প্রাসঙ্গিক topic-- একটি লিঙ্ক আছে প্রক্রিয়া প্রতিকল্পন --in bashমানুষ পাতা।
চ্যানার

উত্তর:


13

পাইপগুলি কেবল 0 (স্টিডিন) এর চেয়ে আলাদা আলাদা ফাইল বর্ণনাকারীর সাথে আবদ্ধ থাকে:

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

একটি প্রক্রিয়া অবশ্যই একসাথে একাধিক ওপেন ফাইল বর্ণনাকারী থাকতে পারে, তাই সমস্যা নেই।


যদি আমি কেবল এটির অস্থায়ী পাইপগুলি জানতাম তবে আমি এটি গুগল করতে সক্ষম হত। ধন্যবাদ!

@ ব্লু: আমার মনে হয় না এটিকে "অস্থায়ী পাইপ" বলা হয়। এটি কেবল পাইপ, যেমন pipe()সিস্টেম কল দ্বারা নির্মিত ।
সোভেন মারনাচ

খুব নির্ভুলভাবে বলতে গেলে, এটি "বেনামে নামযুক্ত পাইপ" বলা যেতে পারে তবে এটি গুগল করার পক্ষে যথেষ্ট।

2
@ উইলিয়ামম্পারসেল: কোনও ফাইল জড়িত নেই। শেলটি একটি বেনামে পাইপ ব্যবহার করে তৈরি করে pipe()এবং তারপরে সাবপ্রসেসগুলি কাঁটাচামচ করে। মূল প্রক্রিয়া করে অতিরিক্ত ফাইল বর্ণনাকারী খোলেন তাহলে একটি বেনামী পাইপ ব্যবহার করা হয় না। এই অতিরিক্ত ফাইল বর্ণনাকারী ফর্মটিতে পাস করা হয় /dev/fd/..., এবং প্রক্রিয়াটি সাধারণত এই ফাইলের নামগুলি ব্যবহার করে এগুলি খুলবে। এটি তাদের dup()আরও বেশি ওপেন ফাইল বর্ণনাকারী তৈরি করে এডি হতে সাহায্য করবে । প্রক্রিয়াটি কোনও খোলা কল ছাড়াই এই
সোভেন মারনাচ

1
... এই ছোট এবং বোকা পরীক্ষা প্রোগ্রাম হিসাবে প্রদর্শিত । সংকলনের পরে a, আমি এটি হিসাবে ডেকেছি ./a <(ls)এবং এটি সফলভাবে ফাইলগুলির তালিকা মুদ্রিত করেছে, প্রমাণিত হয়েছে যে নামযুক্ত ফাইল ডিক্রিপ্টর (আমার ক্ষেত্রে 63৩) ইতিমধ্যে খোলা ছিল। ব্যাশ লিনাক্সের চেয়ে বিভিন্ন আর্কিটেকচারের অস্থায়ী ডিরেক্টরিতে নামযুক্ত পাইপ ব্যবহার করতে পারে, যদি প্রধান প্রক্রিয়াতে প্রবেশের সময় কোনও অতিরিক্ত ফাইল বর্ণনাকারী না খোলা থাকে।
সোভেন মারনাচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.