ওএস এক্স, বাশ: ওপেন ফাইল বর্ণনাকারীর উপর কম কাজ করে, বিড়াল দেয় না


10

বাশ স্ক্রিপ্টে আমি কাজ করছি (যা উবুন্টু এবং ওএস এক্সে চলতে হবে), আমার কয়েকশত কমান্ডের আউটপুট একটি ফাইলে পুনর্নির্দেশ করা দরকার। তাদের সকলের সাথে
যুক্ত &>...হওয়ার পরিবর্তে আমি কেবল এটি করি

exec 9>&1
exec 5<>/tmp/some-file.txt
exec 1>&5

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

cat /dev/fd/5

অথবা

tee </dev/fd/5

তবে ওএস এক্স-তে কোনও কিছুই মুদ্রিত হয় না (এবং কমান্ডগুলি অবিলম্বে প্রস্থান করা হয়)।
তবে, ব্যবহার করে lessআমি উভয়ই ফাইলের সামগ্রী দেখতে পাচ্ছি।
আমি উপরের প্রভাবটি (উভয় ওএস'এর উপর কাজ করে) অর্জন করতে পারি

less /dev/fd/5 | tee

তবে সেটা হ্যাকের মতো মনে হচ্ছে।

সুতরাং, ওএস এক্স এ না থাকা lessজিনিসগুলি কেন দৃশ্যত দেখা catযাবে? (বা সমস্ত বিএসডি বংশধরেরা প্রভাবিত?)
নাকি আমি কিছু ভুল করছি?

উত্তর:


13

ওএস এক্স-তে , লিনাক্স ব্যতীত যে সমস্ত সিস্টেমে তারা সমর্থিত সেখানে ওপেন করানো সমান, ফলস্বরূপ এফডি কম-বেশি পয়েন্টগুলি একইভাবে ওপেন ফাইল বর্ণনার জন্য কমপক্ষে পয়েন্ট /dev/fd/xহ'ল dup(x)এবং বিশেষত ফাইলের মধ্যে একই অফসেট থাকবে।

লিনাক্স এখানে ব্যতিক্রম। লিনাক্সে, এফডি এক্স-এ খোলা ফাইলটির /dev/fd/xএকটি সিডিমিংক /proc/self/fd/xএবং /proc/self/fd/xসিউডো-সিএমিলিংক। লিনাক্স উপর যখন আপনি একটি না open("/dev/fd/x", somemode), আপনি একটি ব্র্যান্ড নতুন পেতে খোলা ফাইল বিবরণ খোলা হিসাবে একই ফাইলে x। আপনার প্রাপ্ত নতুন এফডি কোনওভাবেই এফডি এক্স এর সাথে সম্পর্কিত নয়। বিশেষত, অফসেটটি ফাইলের শুরুতে হবে (যদি আপনি O_APPENDঅবশ্যই এটি খুলুন তবে ) এবং মোড (পড়ুন / লিখুন / সংযোজন করুন ...) এফডি এক্স-এর চেয়ে আলাদা হতে পারে (আপনি এমনকি পেতে পারেন) বিপরীত মোডে খোলার সময় পাইপের অন্য প্রান্তের মতো, এফডি এক্সে থাকা থেকে কিছু আলাদা) (এর অর্থ হ'ল এটি সকেটের জন্য কাজ করে না যা উদাহরণস্বরূপ আপনি খুলতে পারবেন না ) ( )।

সুতরাং, লিনাক্স-এ, যখন আপনি করেন

exec 5<> file
echo test >&5

এফডি 5 এর অফসেটটি ফাইলের শেষে রয়েছে। যদি তুমি করো

cat <&5

আপনি কিছুই পান না।

তবুও আপনি যখন করবেন:

cat /dev/fd/5

আপনি দেখুন testকারণ catএকটি নতুন পঠনযোগ্য এফডি fileএফডি 5 এর সাথে সম্পর্কিত নয়।

অন্যান্য সিস্টেমে, উপর

cat /dev/fd/5

cat একটি এফডি পায় যা এফডি 5 এর সদৃশ, তাই এখনও ফাইলের শেষে একটি অফসেট সহ।

কারণ কেন এটিকে সাথে কাজ করে lessযে কোনো কারণে, হয় lessএকটি করে lseek()(ক নেই ফাইলের শুরুতে যে FD উপর lseek(1); lseek(0)কিনা তা নির্ধারণ করতে ফাইল seekable কি না)।

এখানে, আপনি সম্ভবত পড়ার জন্য একটি এফডি এবং একটি লেখার জন্য চান যদি আপনি উভয়ই আলাদা অফসেট রাখতে চান:

exec 5< file 9>&1 > file

অথবা আপনি যদি এখনও সেখানে থাকেন তবে ফাইলটি আবার খুলতে হবে, বা একটি lseek()কাজ lessকরতে হবে।

ksh93এবং zshবিল্টিন lseek()অপারেটর সহ একমাত্র শেলগুলি যদিও:

cat <&5 <#((0)) # ksh93
{sysseek 0; cat} <&5 # zsh, zmodload zsh/system to enable that builtin

বা:

cat /dev/fd/5 5<#((0))  # ksh93
sysseek -u 5 0; cat /dev/fd/5 # zsh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.