ফাইল বর্ণনাকারী এবং শেল স্ক্রিপ্টিং


32

শেল স্ক্রিপ্টগুলিতে একজন কীভাবে ফাইল বর্ণনাকারী ব্যবহার করে তা বোঝার জন্য আমার খুব কষ্ট হচ্ছে।

আমি যেমন বেসিক জানি

exec 5 > /tmp/foo

সুতরাং fd 5 লেখার জন্য foo এর সাথে সংযুক্ত থাকে।

exec 6 < /tmp/bar

… পড়ার জন্য.

exec 5>&-

… বন্ধ এফডি।

এখন এই কি করে?

#!/bin/bash

exec 5 > /tmp/foo 
exec 6 < /tmp/bar 

cat <&6 | while read a
do
     echo $a >&5
done

আমি যেমন বুঝতে পেরেছি &5এফডি বন্ধ করে দেয়, সুতরাং কিভাবে প্রতিটি কল করার পরে আউটপুট সফলভাবে পুনঃনির্দেশিত হচ্ছে?

এটি একটি অনুলিপি পাস্তা থেকে: এখানে

এটি দাবি করে echo $a > fileযে এটি একটি সাধারণ ব্যবহার করে এটি আরও দ্রুত তৈরি করবে, তবে আমি বুঝতে ব্যর্থ হয়েছি। আমি শালীন টিউটোরিয়ালের যে কোনও লিঙ্কের প্রশংসা করব। আমি গুগল শক্তিগুলি আমাকে ব্যর্থ বলে মনে হচ্ছে।

উত্তর:


44

প্রথমে নোট করুন ফাইলটি ডেস্ক্রিপ্টর লেখার জন্য বা পড়ার জন্য পড়ছে কিনা তার উপর নির্ভর করে বন্ধ করার সিনট্যাক্সটি হয় 5>&-বা 6<&-। ব্লগ পোস্টটিতে একটি টাইপো বা ফর্ম্যাটিং ভুল আছে বলে মনে হচ্ছে।

এখানে মন্তব্য স্ক্রিপ্ট।

exec 5>/tmp/foo       # open /tmp/foo for writing, on fd 5
exec 6</tmp/bar       # open /tmp/bar for reading, on fd 6
cat <&6 |             # call cat, with its standard input connected to
                      # what is currently fd 6, i.e., /tmp/bar
while read a; do      # 
  echo $a >&5         # write to fd 5, i.e., /tmp/foo
done                  # 

এখানে কোন বন্ধ নেই। সমস্ত সাধারণ ইনপুট এবং আউটপুটগুলি এই সাধারণ উদাহরণে একই জায়গায় চলেছে বলে অতিরিক্ত ফাইল বর্ণনাকারীর ব্যবহারের প্রয়োজন নেই। আপনি লিখতে পারে

cat </tmp/bar |
while read a; do
  echo $a
done >/tmp/foo

যখন আপনি একসাথে একাধিক ফাইলে লিখতে চান সুনির্দিষ্ট ফাইল বর্ণনাকারী ব্যবহার দরকারী হয়। উদাহরণস্বরূপ, এমন একটি স্ক্রিপ্ট বিবেচনা করুন যা ডেটা আউটপুট ফাইলের ডেটা এবং একটি লগ ফাইলে লগিং ডেটা এবং সম্ভবত ত্রুটি বার্তাগুলিতেও আউটপুট করে। এর অর্থ তিনটি আউটপুট চ্যানেল: একটি ডেটার জন্য, একটি লগের জন্য এবং একটি ত্রুটির জন্য। যেহেতু আউটপুট জন্য মাত্র দুটি স্ট্যান্ডার্ড বর্ণনাকারী রয়েছে, তৃতীয়টি প্রয়োজন। execআউটপুট ফাইলগুলি খোলার জন্য আপনি কল করতে পারেন :

exec >data-file
exec 3>log-file
echo "first line of data"
echo "this is a log line" >&3

if something_bad_happens; then echo error message >&2; fi
exec >&-  # close the data output file
echo "output file closed" >&3

দক্ষতা সম্পর্কে মন্তব্যটি তখন আসে যখন আপনার কোনও লুপে পুনর্নির্দেশ হবে, (যেমন ধরুন ফাইলটি শুরুর জন্য খালি রয়েছে):

while …; do echo $a >>/tmp/bar; done

প্রতিটি পুনরাবৃত্তিতে, প্রোগ্রামটি খোলে /tmp/bar, ফাইলটির শেষের দিকে সন্ধান করে, কিছু ডেটা যুক্ত করে এবং ফাইলটি বন্ধ করে দেয়। একবার এবং সকলের জন্য ফাইলটি খোলার পক্ষে এটি আরও দক্ষ:

while …; do echo $a; done >/tmp/bar

যখন বিভিন্ন সময়ে একাধিক পুনঃনির্দেশগুলি ঘটে থাকে, তখন কোনও পুনর্নির্দেশে execকোনও ব্লক মোড়কের পরিবর্তে পুনর্নির্দেশগুলি সম্পাদন করার জন্য কল করা দরকারী হয়ে ওঠে।

exec >/tmp/bar
while …; do echo $a; done

আপনি এই সাইটে ট্যাগ ব্রাউজ করে পুনঃনির্দেশের আরওio-redirection কয়েকটি উদাহরণ পাবেন ।


1
হয় ফাইল বর্ণনাকারী বন্ধ করার সিনট্যাক্স আসলে একই কাজ করে।
ব্যবহারকারী 1338062
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.