প্রক্রিয়া প্রতিস্থাপনের ফলে / পাই / ডি / ডি / এফডি / called৩ নামক কোনও ফাইলের ফলাফল হয় কেন?


40

আমি এই নির্দিষ্ট উদাহরণের প্রসঙ্গে নামযুক্ত পাইপগুলি বোঝার চেষ্টা করছি।

আমি <(ls -l)আমার টার্মিনাল টাইপ করি এবং আউটপুট হিসাবে bash: /dev/fd/63: Permission denied

যদি আমি টাইপ করি cat <(ls -l), আমি ডিরেক্টরি সামগ্রী দেখতে পেতাম। যদি আমি এর catসাথে প্রতিস্থাপন echoকরি তবে আমার মনে হয় আমি টার্মিনালের নাম পেয়েছি (বা এটি?)

echo <(ls -l)আউটপুট হিসাবে দেয় /dev/fd/63

এছাড়াও, এই উদাহরণটি আমার কাছে অস্পষ্ট।

ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]

যাইহোক, আমি যদি দিই, ls -l <()এটি আমাকে ডিরেক্টরি বিষয়বস্তু তালিকাভুক্ত করে।

নামক পাইপের ক্ষেত্রে কী হচ্ছে?

উত্তর:


37

যখন আপনি এটি করেন <(some_command), আপনার শেলটি প্রথম বন্ধনীগুলির মধ্যে কমান্ডটি কার্যকর করে এবং পুরো বিষয়টিকে একটি ফাইল বর্ণনাকারীর সাথে প্রতিস্থাপন করে, যা কমান্ডের স্টাডাউটের সাথে সংযুক্ত থাকে। সুতরাং /dev/fd/63একটি পাইপ আপনার এলএস কল আউটপুট ধারণকারী।

আপনি যখন <(ls -l)একটি Permission deniedত্রুটি পান, কারণ পুরো লাইনটি পাইপের সাথে প্রতিস্থাপন করা হয়েছে, কার্যকরভাবে /dev/fd/63একটি কমান্ড হিসাবে কল করার চেষ্টা করছে , যা কার্যকর হয় না।

আপনার দ্বিতীয় উদাহরণে, cat <(ls -l)হয়ে যায় cat /dev/fd/63। প্যারামিটার হিসাবে প্রদত্ত ফাইলগুলি থেকে বিড়াল পড়ার সাথে সাথে আপনি সামগ্রীটি পাবেন। echoঅন্যদিকে কেবল "যেমন রয়েছে" এর পরামিতিগুলি আউটপুট করে।

আপনার কাছে সর্বশেষ <()কেসটি কোনও আদেশ দ্বারা স্থানান্তরিত হয় না। তবে এটি শেলের মধ্যে সামঞ্জস্যপূর্ণ নয়, zsh এ আপনি এখনও একটি পাইপ পান (যদিও খালি)।

সংক্ষিপ্তসার : <(command)আপনাকে একটি কমান্ডের আউটপুট ব্যবহার করতে দেয়, যেখানে আপনার সাধারণত কোনও ফাইলের প্রয়োজন হয়।

সম্পাদনা: গিলস যেমন উল্লেখ করেছেন, এটি কোনও নামযুক্ত পাইপ নয়, তবে একটি বেনামে পাইপ। মূল পার্থক্যটি হ'ল এটি কেবলমাত্র বিদ্যমান, যতক্ষণ প্রক্রিয়াটি চলমান থাকে, যখন একটি নামী পাইপ (যেমন তৈরি করা হয় mkfifo) এটি সংযুক্ত প্রসেস ছাড়াই থাকবে।


5
mkfifoকেবল কোনও বিষয়বস্তু ছাড়াই নামকরণ করা পাইপ তৈরি করে। সুতরাং আপনার নিজের এটি লিখতে হবে (উদাঃ mkfifo mypipe; ls > mypipe)। এবং হ্যাঁ, পাইপ থেকে লেখাগুলি অবরুদ্ধ হবে যতক্ষণ না কোনও প্রক্রিয়া পাইপ থেকে পড়ে।
crater2150

6
এখানে কোনও নামী পাইপ নেই। /dev/fd/63একটি বেনামে পাইপ।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
@ ক্রেটার 2150, @ গিলস / দেব / এফডি / 63৩ আসলে নামযুক্ত পাইপ pipe এ জাতীয় কিছু দিয়ে দেখুন file <(ls)। শেলটি একটি বেনামে পাইপ তৈরি করে, তবে ফাইল বিবরণকারীটি একটি নামযুক্ত পাইপ হিসাবে প্রতিফলিত করে /dev/fd। যদি এটি একটি বেনামে পাইপ থাকে তবে এর কোনও নাম থাকবে না এবং যে আদেশটি /dev/fd/63প্রেরণ করা হয়েছে তা দিয়ে এটি খুলতে পারত না ।
আরভি

2
@ আরভি এটি এখনও একটি অনামী পাইপ pipe আসলে একটি ফাইলের নাম নেই যে এই বেনামী নল বোঝায় এটি একটি নামে পাইপ দেখা যায় না: একটি নামে পাইপ ভিন্ন, এটি একটি ফাইল সিস্টেম কোথাও বিদ্যমান, অনুমতি ও মালিকানা, ইত্যাদি এন্ট্রি হয়েছে /dev/fdকোনো ফাইল পাঠাতে পারেন বর্ণনাকারী, এমনকি বেনামী পাইপ এবং সকেট, নেটওয়ার্ক সকেট, শেয়ার করা মেমরির অংশ, ইত্যাদি
গিলেজ 'SO- স্টপ হচ্ছে মন্দ'

1
কেন এটি 63 ?
কে 3 --- আরএনসি

-4

আপনি lsআদেশ এবং পুনঃনির্দেশ উভয়কেই ভুল বুঝে । lsকমান্ড লাইনে প্রদত্ত ফাইল এবং ডিরেক্টরিগুলি তালিকাভুক্ত করে, আমি বিশ্বাস করি না যে এটি স্টিডিনের কোনও ইনপুট গ্রহণ করে। পুনঃনির্দেশ > >>এবং <ইনপুট দেওয়ার এবং আউটপুট সংগ্রহের জন্য কোনও ফাইল ব্যবহার করার উপায়।


1
এখানে কোনও ফাইল থেকে কোনও পুনর্নির্দেশ নেই। <(…)একটি প্রক্রিয়া প্রতিস্থাপন।
গিলস 21

1
@ আইএমএসওপি - যেমন গিলস বলেছিলেন - এটি কোনও নামযুক্ত পাইপ নয় - এটি একটি বেনামে পাইপ। এটি বেশ কয়েকটি শেলের মতো x|yএবং একইরকম [num]<<REDIRECT। যেখানে এটির পার্থক্য রয়েছে তা হ'ল এফডি লিঙ্কের শেলের আক্ষরিক প্রতিস্থাপন - /dev/fd/63এবং ইত্যাদি এবং এটি কী করে - বা না করে - স্টিডিন সহ। করুন echo | readlink /dev/fd/0এবং নিজের জন্য দেখুন।
মাইকজার্ভ

1
@ আইএমএসওপি - এটি একটি devলিঙ্ক - একটি বিশেষ ফাইল। আপনি বেশিরভাগ লিনাক্স সিস্টেমে একই ডাব্লু / যে কোনও ফাইল বর্ণনাকারী করতে পারেন - এমনকি সাধারণ |pipes, যদিও আমি অন্য কোথাও আচরণের পক্ষে প্রত্যাশা করি না। আপনি যেখান থেকে এসেছেন তা পেয়েছি, তবে একটি নামক পাইপ নিজের কাছে আলাদা জিনিস it এটি একটি কার্নেল পাইপের ফাইল-সিস্টেমের উল্লেখ - একটি নিয়মিত ফাইল-সিস্টেমের রেফারেন্স, কোনও ডিভাইস ফাইল নয়।
মাইকজার্ভ

1
@ মেকজারভ ইন্টারেস্টিং, বাশ ম্যানুয়ালটিতে উল্লেখ করা হয়েছে যে এটি /dev/fd/*অন্য কোথাও নামক পাইপ তৈরি না করে সিস্টেমগুলিতে কাজ করবে । তবে আমি এই বিন্দুটি নিয়েছি যে /dev/fd/*নামকরণ করা পাইপ যথাযথের চেয়ে আলাদা itself ঘটনাক্রমে উইকিপিডিয়া বর্ণনাটি এই পার্থক্যের ব্যাখ্যা দিয়ে করতে পারে।
IMSoP

1
@ মিমকিজার আমার পাওয়া অন্যান্য রেফারেন্স অনুসারে এটি এর চেয়ে সহজ: যদি /dev/fd/*উপলভ্য না হয় তবে বাশ একটি নামযুক্ত পাইপ তৈরি করবে /tmpএবং পরিবর্তে প্রক্রিয়া পরিবর্তনের জন্য এটি ব্যবহার করবে। আমার কাছে এত অদ্ভুত বলে মনে হচ্ছে না, যতটা সম্ভব পরিবেশের মধ্যে কার্যকারিতা উপলব্ধ করে তুলেছে।
IMSoP
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.