একটি ফাইল বর্ণনাকারী বন্ধ করা হচ্ছে,> & - বনাম <& -


49

আমি যে বাশ টিউটোরিয়ালটি পড়ছি তাতে এটি বলছে যে আপনি যদি পড়ার জন্য কোনও ফাইল বর্ণনাকারী খোলেন, যেমন ie

exec 3< echolist

তারপরে আপনাকে অবশ্যই এটি বন্ধ করতে হবে,

exec 3<&-

তবে, আপনি যদি লেখার জন্য কোনও ফাইল বর্ণনাকারী খোলেন তবে এটি অবশ্যই এইভাবে বন্ধ করা উচিত:

exec 3>&-

তবুও যখন আমি ইন্টারনেটে দেখি, আমি লোকদের ফাইলগুলি খুলতে এবং তারপরে এগুলি বন্ধ করে দেখতে পাই:

exec 3>&- 

দ্রষ্টব্য: টিউটোরিয়াল অনুসারে, তাদের ব্যবহার করা উচিত exec 3<&1

সুতরাং আমার প্রশ্নটি হল, সমস্ত ফাইল বর্ণনাকারী exec n>&-যেখানে n ফাইল ফাইল বর্ণনাকারী নম্বর আছে তার মাধ্যমে বন্ধ করা যাবে ? তা পড়ার জন্য, লেখার জন্য, বা উভয়ের জন্যই খোলা থাকলে তা নির্বিশেষে?


21
মধ্যে একমাত্র পার্থক্য >&-এবং <&-যখন নির্দিষ্ট করা নেই ডিফল্ট FD আছে ( >&-হয় 1>&-যখন <&-হয় 0<&-)। জন্য একই x>&yযা হিসাবে একই x<&yব্যতীত যখন xদেওয়া হয় না।
স্টাফেন চেজেলাস

উত্তর:


48

আপনি উভয় ব্যবহার করে ফাইল বর্ণনাকারী বন্ধ করতে পারেন <&-এবং >&-, bashদুটি সিনট্যাক্স একই হিসাবে পার্স করবেন।

ফাইল থেকে y.tab.c মধ্যে bashসোর্স কোড:

5385   /* Hack <&- (close stdin) case.  Also <&N- (dup and close). */                
5386   if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
5387     return (character);

2
এটি <>ফাইল বিবরণকারীগুলিতেও ব্যবহার করা যেতে পারে ।
সিএমসিডিগ্রাগনকাই

1
না এটি সম্ভব নয়, তবে যেমনটি বর্ণনাকারীকে বন্ধ করে দেওয়া হয় 3>&-বা 3<&-প্রদর্শিত হয় তেমন ।
সিএমসিডিগ্রাগনকাই

1
এই সমাপ্তি <>একই উপায়ে করা যেতে পারে।
সিএমসিডিগ্রাগনকাই

1
তুমি যা বলতে চাচ্ছ আমি তা পাচ্ছি না দয়া করে একটি উদাহরণ দিন / /
কিউংলম

1
আমি যা বোঝাতে চাইছিলাম তা মনে হয় না। কেবলমাত্র এএ রিড রাইটিং ফাইল বর্ণনাকারী 3> & - এবং 3 <& - ব্যবহার করেও বন্ধ করা যাবে।
সিএমসিডিগ্রাগনকাই

15

আমি যতদূর দেখতে পাচ্ছি, exec 3>&-এবং exec 3<&-একইরকম এবং এটি যে কোনও ফাইল ডেস্ক্রিপ্টারে ব্যবহার করা যেতে পারে, এটি যেভাবে খোলা হয়েছিল তা নির্বিশেষে। শেল কমান্ড ভাষার POSIX সংজ্ঞাটির 2.7.6 এবং 2.7.5 বিভাগ অনুযায়ী :

2.7.5 একটি ইনপুট ফাইল বর্ণনাকারীর সদৃশ

পুনঃনির্দেশ অপারেটর:

[এন] <& শব্দ

[... স্নিপ ...]

যদি শব্দটি '-' তে মূল্যায়ন করে, ফাইল বর্ণনাকারী এন, বা n নির্দিষ্ট না করা থাকলে স্ট্যান্ডার্ড ইনপুট বন্ধ করা হবে। খালি নয় এমন একটি ফাইল বিবরণকারী বন্ধ করার চেষ্টা করা ত্রুটি হিসাবে চিহ্নিত হবে না। শব্দটি যদি অন্য কোনও কিছুর কাছে মূল্যায়ন করে তবে আচরণটি অনির্দিষ্ট।

২.7. an একটি আউটপুট ফাইল বর্ণনাকারীর সদৃশ

পুনঃনির্দেশ অপারেটর:

[এন]> & শব্দ

[... স্নিপ ...]

শব্দটি যদি '-' এ মূল্যায়ন করে তবে ফাইল বর্ণনাকারী এন, বা n নির্দিষ্ট না করা থাকলে স্ট্যান্ডার্ড আউটপুট বন্ধ থাকে। খালি নয় এমন একটি ফাইল বিবরণকারী বন্ধ করার চেষ্টা করা ত্রুটি হিসাবে চিহ্নিত হবে না। শব্দটি যদি অন্য কোনও কিছুর কাছে মূল্যায়ন করে তবে আচরণটি অনির্দিষ্ট।

মনে রাখবেন যে ফাইল ডেস্ক্রিপ্টর এনটি মূলত কীভাবে খোলা হয়েছিল সে সম্পর্কে কোনও কিছুই নির্দিষ্ট করে না। এটি এই সত্যের সাথে সামঞ্জস্যপূর্ণ যে আপনি কীভাবে ফাইলটি খোলেন সে সম্পর্কে ক্লোজ (2) কোন চিন্তা করে না।

নিম্নলিখিতগুলির একটি দ্রুত স্তূপ:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-

এটি বনাম:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-

উভয় ক্ষেত্রেই বাশ ঠিক একই জিনিসটি দেখায় does

দুটি মৃদু আকর্ষণীয় তথ্য


1
বাশ ম্যান পৃষ্ঠাটি আপনার লিঙ্কটি উদ্ধৃত করে বন্ধ হওয়ার কথা উল্লেখ করেছে: শব্দটি যদি '-' এ মূল্যায়ন করে তবে ফাইল বিবরণকারী এন বন্ধ থাকে।
স্টুড

সূত্রটি পরীক্ষা করার জন্য ধন্যবাদ! আমি মনে করি এখানে কি ঘটেছে আমি ব্যাশ 3 জন্য স্থানীয় র manpage দিকে তাকিয়ে ছিল, এবং তারপর অনলাইন ডকুমেন্টেশন, যা ব্যাশ 4. ছিল পুরাতন ব্যাশ 3 ডকুমেন্টেশন ইন, ক্লোজিং সম্পর্কে ফ্রেজ বর্ণনা থেকে বাদ দেওয়া লিঙ্ক করা হয়েছে [N]>&WORD: Git .savannah.gnu.org / cgit / bash.git / ট্রি / ডক /…
স্টিভেন ডি

7

কোনও '<>' এফডি বন্ধ করার বিষয়ে কুওনলমের বোঝার উদাহরণ।

এটি http://tldp.org/LDP/abs/html/io-redirection.html এ উন্নত বাশ-স্ক্রিপ্টিং গাইড থেকে উদ্ধৃত হয়েছে

[j]<>filename
  #  Open file "filename" for reading and writing,
  #+ and assign file descriptor "j" to it.
  #  If "filename" does not exist, create it.
  #  If file descriptor "j" is not specified, default to fd 0, stdin.
  #
  #  An application of this is writing at a specified place in a file. 
  echo 1234567890 > File    # Write string to "File".
  exec 3<> File             # Open "File" and assign fd 3 to it.
  read -n 4 <&3             # Read only 4 characters.
  echo -n . >&3             # Write a decimal point there.
  exec 3>&-                 # Close fd 3.
  cat File                  # ==> 1234.67890
  #  Random access, by golly.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.