একটি ফাইল বর্ণনাকারী সংরক্ষণ করতে, আপনি এটি অন্য এফডি তে নকল করুন। সংশ্লিষ্ট ফাইলটিতে পাথ সংরক্ষণ করা যথেষ্ট নয়, আপনাকে খোলার মোড, খোলার পতাকাগুলি, ফাইলের মধ্যে বর্তমান অবস্থান এবং আরও অনেক কিছু সংরক্ষণ করতে হবে। এবং অবশ্যই, বেনামে পাইপ, বা সকেটের জন্য, এটি কাজ করবে না কারণ তাদের কোনও পথ নেই। কি আপনি সংরক্ষণ করতে চান খোলা ফাইল বিবরণ যে FD উল্লেখ করে, এবং অনুরূপ একটি FD আসলে একই একটি নতুন FD ফিরে আসছে খোলা ফাইল বিবরণ ।
বোর্নের মতো শেল সহ অন্য কোনও ফাইলের বর্ণনা নকল করতে সিনট্যাক্সটি হ'ল:
exec 3>&1
উপরে, এফডি 1 এফডি 3 এ নকল করা হয়।
এর আগে যে কোনও এফডি 3 এর আগে খোলা ছিল তা বন্ধ হয়ে যাবে, তবে লক্ষ্য রাখবেন যে 3 থেকে 9 টি (সাধারণত আরও 99 টি পর্যন্ত yash
) সংরক্ষণ করা হয় (এবং 0, 1, বা 2 এর বিপরীতে কোনও বিশেষ অর্থ নেই), শেল তাদের নিজের অভ্যন্তরীণ ব্যবসায়ের জন্য ব্যবহার না করতে জানে। Fd 3 এর আগেই কেবল খোলা থাকতে পারে কারণ আপনি এটি স্ক্রিপ্ট 1 এ করেছিলেন , বা এটি কলার দ্বারা ফাঁস হয়েছিল।
তারপরে, আপনি স্টাডাউটকে অন্য কোনও কিছুতে পরিবর্তন করতে পারেন:
exec > /dev/null
এবং পরে, stdout পুনরুদ্ধার করতে:
exec >&3 3>&-
( 3>&-
ফাইল বিবরণী বন্ধ করার জন্য যা আমাদের আর প্রয়োজন নেই)।
এখন, এর সাথে সমস্যাটি হ'ল ksh ব্যতীত আপনার পরে চালানো প্রতিটি কমান্ড exec 3>&1
সেই এফডি 3 এর উত্তরাধিকারী হবে That's এটি একটি এফডি ফুটো। সাধারণত কোনও বড় বিষয় নয়, তবে এটি সমস্যার কারণ হতে পারে।
ksh
সেট করে ক্লোজ-অন Exec ঐ fds থাকা ফ্ল্যাগ (2 উপর fds জন্য), কিন্তু অন্যান্য না শাঁস এবং অন্যান্য শাঁস যে পতাকা ম্যানুয়ালি সেট জন্য কোনো উপায় থাকে না।
অন্যান্য শেলের জন্য কাজটি প্রতিটি কমান্ডের জন্য fd 3 বন্ধ করা, যেমন:
exec 3>&-
exec > file.log
ls 3>&-
uname 3>&-
exec >&3 3>&-
কষ্টকর। এখানে, সর্বোত্তম উপায়টি হ'ল ব্যবহার না করা exec
, তবে কমান্ড গোষ্ঠীগুলি পুনর্নির্দেশ করা:
{
ls
uname
} > file.log
সেখানে এটি শেলটি স্টাডাউট সংরক্ষণ এবং পরে পুনরুদ্ধার করতে যত্ন নেয় (এবং এটি অভ্যন্তরীণভাবে এফডি-তে ডুপ্লিকেট করে (9 এর উপরে, 99 এর উপরে yash
) ক্লোজ-অন-এক্সিকিউট পতাকা সেট সহ)।
নোট 1
এখন, 3 থেকে 9 টি এইচডিএসের পরিচালনা করা জটিল এবং সমস্যাযুক্ত হতে পারে যদি আপনি এগুলি ব্যাপকভাবে বা ফাংশনগুলিতে ব্যবহার করেন, বিশেষত যদি আপনার স্ক্রিপ্টটিতে এমন কোনও তৃতীয় পক্ষের কোড ব্যবহার করা হয় যা পরিবর্তিতভাবে এফডিএস ব্যবহার করতে পারে।
কিছু শাঁস ( zsh
, bash
, ksh93
, সমস্ত বৈশিষ্ট্য (যোগ এর অলিভার বেড়াজাল দ্বারা প্রস্তাবিতzsh
2005 সালে প্রায় একই সময়) পর তাদের বিকাশকারীদের মধ্যে আলোচনা করা হয়েছে) পরিবর্তে 10 যা এই ক্ষেত্রে সাহায্য করে উপরে প্রথম বিনামূল্যে FD দায়িত্ব অর্পণ করা একটি বিকল্প বাক্য গঠন আছে:
myfunction() {
local fd
exec {fd}>&1
# stdout was duplicated onto a new fd above 10, whose actual value
# is stored in the fd variable
...
# it should even be safe to re-enter the function here
...
exec >&"$fd" {fd}>&-
}