<() Z এ (এবং = () জ্যাশে) ঠিক কী?


36

আমি বাশের সাথে বেশ সাবলীল, তবে সম্প্রতি আমি এমন একটি প্রতিস্থাপনে শেষ করেছিলাম যা আমার জানা ছিল না।

<(<command>)বাশ ঠিক কি আছে? এটি কীভাবে =(<command>)zsh এর সাথে তুলনা করে ?

আমি বুঝতে পারি যে এটির ডিফল্ট ফাইল বর্ণনাকারীদের সাথে কিছু করার আছে। আমার কম্পিউটারে

echo <()

ফিরে আসে /proc/self/fd/11, যা আমি স্ক্রিপ্টের অনুলিপিটির অনুলিপি হিসাবে পেয়েছি, তবে এটি এখনও আমার কাছে বেশ বিভ্রান্তিকর বলে মনে হচ্ছে।

উত্তর:


51

একে প্রক্রিয়া প্রতিস্থাপন বলা হয়।

<(list)সিনট্যাক্স উভয় দ্বারা সমর্থিত, bashএবং zshlistপাইপ ব্যবহার করা |সম্ভব না হলে এটি কমান্ডের আউটপুটকে অন্য কমান্ডে যাওয়ার উপায় সরবরাহ করে । উদাহরণস্বরূপ, যখন কোনও কমান্ড কেবলমাত্র ইনপুট সমর্থন করে না STDINবা আপনার একাধিক কমান্ডের আউটপুট প্রয়োজন:

diff <(ls dirA) <(ls dirB)

<(list)সিস্টেম দ্বারা সমর্থিত হলে, listফাইলের সাথে আউটপুট সংযুক্ত করে /dev/fd, অন্যথায় একটি নামযুক্ত পাইপ (FIFO) ব্যবহার করা হয় (এটি সিস্টেমের সমর্থনের উপরও নির্ভর করে; ম্যানুয়াল দুটিও বলে না যে উভয় প্রক্রিয়া সমর্থন না করলে কি হয়, সম্ভবত এটি এর সাথে বাতিল হয়) একটি ভুল). ফাইলটির নামটি কমান্ড লাইনে যুক্তি হিসাবে পাস করা হয়।


zshঅতিরিক্ত =(list)হিসাবে সম্ভাব্য প্রতিস্থাপন সমর্থন করে <(list)=(list)অস্থায়ী ফাইলের সাথে ফাইল /dev/fdবা একটি ফিফোর পরিবর্তে ব্যবহৃত হয় । <(list)প্রোগ্রামটি যদি আউটপুটটিতে সন্ধান করার প্রয়োজন হয় তবে এটি প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে ।

জেডএসএইচ ম্যানুয়াল অনুসারে কীভাবে <(list)কাজ করে তা নিয়ে অন্যান্য সমস্যাও থাকতে পারে :

=উভয় ফর্ম দরকারী /dev/fdএবং নামে পাইপ বাস্তবায়ন <(...)অপূর্ণতা আছে। পূর্ববর্তী ক্ষেত্রে, কিছু প্রোগ্রাম কমান্ড লাইনে ফাইলটি পরীক্ষা করার আগে প্রশ্নযুক্ত ফাইল বর্ণনাকারীটিকে স্বয়ংক্রিয়ভাবে বন্ধ করতে পারে, বিশেষত যদি সুরক্ষা কারণে যেমন প্রোগ্রামটি সেটআপ হয় তখন এটি প্রয়োজন হয় this দ্বিতীয় ক্ষেত্রে, প্রোগ্রামটি যদি ফাইলটি প্রকৃতপক্ষে না খোলায়, পাইপ থেকে পড়তে বা লেখার চেষ্টা করা সাবসেল চিরতরে ব্লক হয়ে যাবে (একটি সাধারণ প্রয়োগে, বিভিন্ন অপারেটিং সিস্টেমের বিভিন্ন আচরণ থাকতে পারে) এবং স্পষ্টভাবে হত্যা করতে হবে । উভয় ক্ষেত্রেই, শেলটি আসলে পাইপ ব্যবহার করে তথ্য সরবরাহ করে, যাতে যে প্রোগ্রামগুলি ফাইলটিতে সন্ধানের (ম্যান পৃষ্ঠাটি দেখুন lseek(2)) কাজ করে না সেগুলি কাজ করে না।


এটি আমাকে ম্যাকোসকে কেন pfctl -f <(echo "pf rules")খারাপ ফাইল বর্ণনাকারী বলবে তা বুঝতে সহায়তা করে । পরিবর্তে zsh এবং = (প্রতিধ্বনি "পিএফ বিধি") ব্যবহার করে।
johnnyB

9

দ্রষ্টব্য, এটি বাশ উত্তর, zsh নয়।

ব্যাশে এমন কিছু মামলা রয়েছে যেখানে আপনি পাইপ ব্যবহার করতে পারবেন না:

some_command | some_other_command

পাইপগুলি পাইপলাইনের প্রতিটি উপাদানগুলির জন্য সাবশেলগুলি প্রবর্তন করে, যখন সাব-শেলগুলি প্রস্থান করে, আপনি যে কোনও পার্শ্ব-প্রতিক্রিয়াটির উপর নির্ভর করেছিলেন অদৃশ্য হয়ে যাবে। উদাহরণস্বরূপ, এই স্বীকৃত উদাহরণ:

cat file | while read line; do ((count++)); done
echo $count

একটি ফাঁকা লাইন প্রদর্শন করবে, কারণ $countচলকের বর্তমান শেলটিতে বিদ্যমান নেই।

একটি ব্যাশ প্রক্রিয়া প্রতিস্থাপন আপনাকে "কিছু_কম্যান্ড" আউটপুট থেকে যেমন কোনও ফাইল থেকে পড়তে দেয় তা এই ঝাঁকুনি এড়াতে দেয়

while read line; do ((count++)); done < <(cat file)
# ....................................1.2
echo $count   # the variable *does* exist in the current shell

(1) একটি সাধারণ ইনপুট পুনঃনির্দেশ। (2) <()প্রক্রিয়া প্রতিস্থাপন সিনট্যাক্স শুরু।


2
= (সেন্টিমিস্টলিস্ট) zsh এর প্রায় একই রকম প্রভাব <(সেমিডলিস্ট) বাশের মধ্যে রয়েছে তবে এটি পুনর্নির্দেশের জন্য সেমিডলিস্টের আউটপুট সহ একটি অস্থায়ী ফাইল তৈরি করে (এবং প্রস্তুত হলে মুছে ফেলা হয়)। সম্ভাব্য প্রোগ্রামে সম্পন্ন করার সময় এটি ভাল হয়। <(সেমিডলিস্ট) zsh দ্বারাও পরিচিত।
গম্বাই স্যান্ডোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.