3>&4-
একটি ksh93 এক্সটেনশান এছাড়াও বাশ দ্বারা সমর্থিত এবং এটি সংক্ষিপ্ত 3>&4 4>&-
, এটি এখন 3 যেখানে 4 ব্যবহৃত হয় এখন নির্দেশ করে, এবং 4 এখন বন্ধ, সুতরাং 4 দ্বারা চিহ্নিত করা এখন 3 এ চলে গেছে।
সাধারণ ব্যবহার আপনি নকল করেছেন stdin
বা এর stdout
অনুলিপি সংরক্ষণ করতে এবং এটি পুনরুদ্ধার করতে চান এমন ক্ষেত্রে যেমন:
ধরুন আপনি কোনও ভেরিয়েবলের একা একা রেখে কমান্ডের স্টডারার (এবং কেবল স্টডার) ক্যাপচার করতে চান।
কমান্ড প্রতিস্থাপন var=$(cmd)
, একটি পাইপ তৈরি করে। পাইপের লেখার cmd
প্রান্তটি স্ট্যাডআউট (ফাইলের বর্ণনাকারী 1) হয়ে যায় এবং অন্য প্রান্তটি ভেরিয়েবলটি পূরণ করার জন্য শেলটি দিয়ে পড়ে।
এখন, আপনি যদি চান stderr
পরিবর্তনশীল যেতে, আপনি কি পারে: var=$(cmd 2>&1)
। এখন fd 1 (stdout) এবং 2 (stderr) উভয় পাইপ (এবং অবশেষে পরিবর্তনশীল) এ যান, যা আমরা যা চাই তার অর্ধেক মাত্র।
যদি আমরা var=$(cmd 2>&1-)
(সংক্ষেপে var=$(cmd 2>&1 >&-
) করি cmd
, তবে কেবলমাত্র স্টাডার পাইপে যায় তবে fd 1 বন্ধ থাকে। যদি cmd
কোনও আউটপুট লেখার চেষ্টা করা হয়, এটি একটি EBADF
ত্রুটি দিয়ে ফিরে আসবে , যদি এটি কোনও ফাইল খোলায়, এটি প্রথম ফ্রি এফডি পাবে stdout
এবং কমান্ড তার বিরুদ্ধে রক্ষিত না হলে খোলা ফাইলটিকে নির্ধারিত করা হবে ! আমরা যা চাই তা নয় Not
যদি আমরা চাই যে স্টাডাউটটি cmd
একা থেকে যায়, এটি একই উত্সকে নির্দেশ করতে পারে যা এটি কমান্ড প্রতিস্থাপনের বাইরে নির্দেশ করেছিল, তবে আমাদের কমান্ড প্রতিস্থাপনের অভ্যন্তরে সেই সংস্থানটি আনতে হবে need তার জন্য আমরা কমান্ড সাবস্টিটিউশনের stdout
বাইরে এটির ভিতরে নিয়ে যাওয়ার একটি অনুলিপি করতে পারি ।
{
var=$(cmd)
} 3>&1
কোনটি পরিষ্কার লেখার উপায়:
exec 3>&1
var=$(cmd)
exec 3>&-
(এটি শেষ পর্যন্ত বন্ধ করার পরিবর্তে এফডি 3 পুনরুদ্ধার করার সুবিধাও রয়েছে)।
তারপরে {
(বা exec 3>&1
) এবং }
সর্বোপরি, উভয় এফডি 1 এবং 3 একই উত্সটির দিকে নির্দেশ করে fd 1 প্রাথমিকভাবে নির্দেশ করে। কমান্ড সাবস্টিটিউশনের ভিতরে এইচডি 3 টি সেই সংস্থানটির দিকেও ইঙ্গিত করবে (কমান্ড সাবস্টিটিউশন কেবলমাত্র fd 1, stdout পুনর্নির্দেশ করে)। উপরে তাই, জন্য cmd
, আমরা এফডিএস 1, 2, 3 পেয়েছি:
- পাইপটি ভারে
- অস্পৃষ্ট
- কমান্ড প্রতিস্থাপনের বাইরে 1 পয়েন্ট হিসাবে একই
যদি আমরা এটিকে পরিবর্তন করি:
{
var=$(cmd 2>&1 >&3)
} 3>&1-
তারপরে এটি হয়ে যায়:
- কমান্ড প্রতিস্থাপনের বাইরে 1 পয়েন্ট হিসাবে একই
- পাইপটি ভারে
- কমান্ড প্রতিস্থাপনের বাইরে 1 পয়েন্ট হিসাবে একই
এখন, আমরা যা চেয়েছিলাম তা পেয়েছি: স্টার্ডার পাইপের কাছে যায় এবং স্টাডআউটটি অদৃশ্য হয়ে যায়। তবে আমরা সেই এফডি 3 থেকে ফাঁস করছি cmd
।
কমান্ডগুলি (কনভেনশন অনুসারে) fds 0 থেকে 2 টি উন্মুক্ত এবং মানক ইনপুট, আউটপুট এবং ত্রুটি হিসাবে ধরে নেয়, তারা অন্যান্য এফডিএসের কিছুই গ্রহণ করে না। সম্ভবত তারা এফডি 3 টি ছেড়ে চলে যাবে। তাদের যদি অন্য কোনও ফাইল বর্ণনাকারীর প্রয়োজন হয় তবে তারা কেবল এমনটি করবেন open()/dup()/socket()...
যা প্রথম উপলব্ধ ফাইল বিবরণী ফিরিয়ে দেবে। যদি (শেল স্ক্রিপ্টের মতো এটি exec 3>&1
) তাদের fd
বিশেষভাবে এটি ব্যবহারের প্রয়োজন হয় তবে তারা প্রথমে এটি কোনও কিছুতে অর্পণ করবে (এবং সেই প্রক্রিয়াতে, আমাদের এফডি 3 দ্বারা পরিচালিত সংস্থানটি সেই প্রক্রিয়াটি প্রকাশ করবে)।
এফডি 3 বন্ধ করার পক্ষে এটি ভাল অনুশীলন যেহেতু cmd
এটি ব্যবহার করে না, তবে এটি কল করার আগে যদি আমরা এটি নির্ধারিত ত্যাগ করি তবে এটি কোনও বড় কথা cmd
। সমস্যাগুলি হতে পারে: এটি cmd
(এবং অন্যান্য সম্ভাব্য প্রসেসগুলি যা এটি তৈরি করে) এর কাছে এটির তুলনায় আরও কিছু কম পরিমাণে এফডি পাওয়া যায়। একটি সম্ভাব্য আরও গুরুতর সমস্যা হ'ল যদি এইচডি পয়েন্ট যে সংস্থানটি cmd
ব্যাকগ্রাউন্ডে তৈরি হওয়া কোনও প্রক্রিয়া দ্বারা শেষ হতে পারে । এটি উদ্বেগের কারণ হতে পারে যদি সেই সংস্থানটি কোনও পাইপ বা অন্য আন্ত-প্রক্রিয়া যোগাযোগের চ্যানেল হয় (যেমন আপনার স্ক্রিপ্টটি যখন চালিত হয় script_output=$(your-script)
), এর অর্থ অন্য প্রান্ত থেকে প্রক্রিয়াটি পড়া কখনই ফাইলের শেষের দিকে দেখবে না পটভূমি প্রক্রিয়া সমাপ্ত।
সুতরাং এখানে, এটি লিখতে ভাল:
{
var=$(cmd 2>&1 >&3 3>&-)
} 3>&1
যা দিয়ে bash
সংক্ষিপ্ত করা যেতে পারে:
{
var=$(cmd 2>&1 >&3-)
} 3>&1
এটি খুব কম ব্যবহৃত হয়েছে তার কারণগুলি সংক্ষেপে:
- এটি অ-মানক এবং কেবল সিনট্যাকটিক চিনি। আপনার স্ক্রিপ্টটি কম পোর্টেবল এবং সেই অস্বাভাবিক বৈশিষ্ট্যটির সাথে ব্যবহার না করা লোকের কাছে কম সুস্পষ্ট করে তুলতে আপনার কয়েকটি কীস্ট্রোক সংরক্ষণের ভারসাম্য বজায় রাখতে হবে।
- আসল এফডিটিকে ডুপ্লিকেট করার পরে বন্ধ করার প্রয়োজনীয়তাটি প্রায়শই উপেক্ষা করা হয় কারণ বেশিরভাগ সময় আমরা ফলাফলটি ভোগ করি না, তাই আমরা কেবল এর
>&3
পরিবর্তে >&3-
বা করি >&3 3>&-
।
প্রমাণ যে এটি খুব কমই ব্যবহার করা হয়েছে, যেমন আপনি আবিষ্কার করেছেন যে এটি ব্যাশে বোগাস । ব্যাশে compound-command 3>&4-
বা any-builtin 3>&4-
পাতার 4 বন্ধ পরেও FD compound-command
বা any-builtin
ফিরে এসেছে। সমস্যা সমাধানের জন্য একটি প্যাচ এখন (2013-02-19) উপলভ্য।