লিনাক্সে ">>" ব্যবহার করার সময় কি বাশ ফাইলগুলি O_APPEND এ খুলবে?


38

আমরা যদি ব্যবহার করি echo 1234 >> some-fileতবে ডকুমেন্টেশন বলে যে আউটপুট সংযোজন করা হয়েছে।

আমার ধারণাটি হ'ল, যদি কিছু-ফাইল উপস্থিত না থাকে তবে O_CREAT একটি নতুন ফাইল তৈরি করবে। যদি >এটি ব্যবহার করা হয়, তবে O_TRUNC বিদ্যমান ফাইলটি কেটে ফেলবে।

এর ক্ষেত্রে >>: ফাইলটি কি O_WRONLY (বা O_RDWR) হিসাবে খোলা হবে এবং সমাপ্তি এবং লেখার কাজটি সম্পন্ন করার চেষ্টা করা হবে, ও_এপিপিএন্ডের অনুকরণ করে? বা ফাইলটিকে O_APPEND হিসাবে খোলা হবে, এটি কার্নেলের কাছে রেখে নিশ্চিত হয়ে যাবে এডিংটি ঘটবে?

আমি এটি জিজ্ঞাসা করছি কারণ একটি কনজার্ভার প্রক্রিয়া ইকো দ্বারা সন্নিবেশিত কিছু চিহ্নিতকারীকে ওভাররাইট করছে, যখন আউটপুট ফাইলটি এনএফএস মাউন্ট পয়েন্ট থেকে আসে, এবং এনএফএস ডকুমেন্টেশন বলে যে ও_এপিপেন্ড সার্ভারে সমর্থিত নয়, তাই ক্লায়েন্ট কার্নেলটিকে এটি পরিচালনা করতে হবে। আমি অনুমান করি যে কনজার্ভার প্রক্রিয়াটি O_APPEND ব্যবহার করছে তবে >>লিনাক্সে ব্যাশ করা নিশ্চিত নয় , সুতরাং এখানে প্রশ্ন জিজ্ঞাসা করছে।


12
এনএফএস-এ সমস্যাটি O_APPENDসমর্থিত নয়; সমস্যা এটি অনুকরণ করা হয়। একটি স্থানীয় ফাইল সিস্টেমে, একই ফাইলটিতে লিখিত বেশ কয়েকটি প্রক্রিয়া O_APPEND কখনও একে অপরের ডেটা ওভাররাইট করে না; এনএফএস-এ, O_APPENDলেখার আগে শেষের সন্ধান করে অনুকরণ করা হয়, যা রেসের অবস্থার সম্ভাবনা ছেড়ে দেয়। এনএফএসে এর আশেপাশে কোনও উপায় নেই; প্রতিটি সমান্তরাল লেখকের নিজস্ব ফাইল লিখতে হবে। এটিকে ঘিরে কাজ করার একমাত্র উপায় হ'ল এনএফএস সার্ভারে একটি সার্ভার প্রক্রিয়া সেটআপ করা, লগারে লগ থাকা |nc server portএবং সার্ভারটিকে লগটিতে আগত ডেটা সংযোজন করা।
গুট্রাম ব্লহম

@ গুন্ট্রামব্লাহ্ম, +1, নিশ্চিতকরণের জন্য ধন্যবাদ। মূলত, আপনার পরামর্শটি ফাইলটিতে কেবলমাত্র একটি লেখক প্রক্রিয়া ব্যবহার করার জন্য এবং অন্য সমস্ত লেখক প্রক্রিয়া এই প্রক্রিয়াটির মধ্য দিয়ে যাবে।
প্রেম

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

6
সংক্ষেপে, এনএফএস একটি বাগের বোঝা এবং এটি ব্যবহার করা উচিত নয়।
আর ..

2
হ্যাঁ, তবে ও_এক্সএলসিএল উদ্ভাবিত হওয়ার পরে আমরা ইতিমধ্যে সেই পথটি শিখেছি।
কেভিন

উত্তর:


60

আমি এটি দৌড়েছি: strace -o spork.out bash -c "echo 1234 >> some-file"আপনার প্রশ্নটি বের করার জন্য। এটি আমি খুঁজে পেয়েছি:

open("some-file", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3

যে ডিরেক্টরিতে আমি echoকমান্ডটি চালিয়েছিলাম সেখানে "কিছু-ফাইল" নামক কোনও ফাইল বিদ্যমান নেই ।


50

এটি কেবল বাশের ক্ষেত্রেই করা হয় না, এটি স্ট্যান্ডার্ড দ্বারা প্রয়োজনীয়।

একক ইউনিক্স স্পেসিফিকেশন থেকে :

সংযুক্ত আউটপুট পুনঃনির্দেশের ফলে শব্দটির প্রসার থেকে ফলাফলটির নাম নির্ধারিত ফাইল বর্ণনাকারীর আউটপুট জন্য খোলা হবে cause ফাইলটি এমনভাবে খোলা আছে যেন POSIX.1-2-2008 এর সিস্টেম ইন্টারফেস ভলিউমে সংজ্ঞায়িত ওপেন () ফাংশনটিকে O_APPEND পতাকা সহ ডাকা হয়েছিল। যদি ফাইলটি না থাকে তবে এটি তৈরি করা হবে।

যে কোনও POSIX- কমপ্লায়েন্ট শেল তাই এটি করা আবশ্যক। কিছু ইউনিক্স সিস্টেমে /bin/shপঞ্জিক্সহীন বোর্ন শেল হতে পারে (বোর্ন শেলটি মূলত O_APPENDউদ্ভাবিত হওয়ার আগে লেখা হয়েছিল) এবং উপলভ্য পসিক্স শেলটি সাধারণত থাকবে kshযা shসোলারিসের মতো ভিন্ন পথের জায়গায় পাওয়া যাবে /usr/xpg4/bin


2
মজার বিষয় হল, একটি শেল যা এটি করে না তা হ'ল বোর্ন শেল। বোর্ন শেলটি O_TRUNC এবং lseek () গুলি ব্যতীত খোলে। কারণ এটি O_APPEND পতাকাটি যুক্ত হওয়ার আগে এটি লেখা হয়েছিল open()>>থমসন শেল নিজেই এর পূর্বসূরীর পরিচয় দিয়েছিল।
স্টাফেন চেজেলাস

1
@ স্টাফেনচাজেলাস এছাড়াও, আমি বিভিন্ন সংস্করণের জন্য সি শেল উত্সটি সন্ধান করেছি এবং ও_এপিপেন্ড পতাকাটি ৪.৩ বিএসডি-রেনো পর্যন্ত চালু করা হয়নি।
র্যান্ডম 832

এটি "যেনে" বলে, তাই এটি কি অন্যভাবে কার্যকর করা যায় নি (তবে একই পর্যবেক্ষণযোগ্য প্রভাব তৈরি করা)? দেখে মনে হচ্ছে না যে স্ট্যান্ডার্ডটির জন্য O_APPEND ব্যবহার করা দরকার, এমন কিছু যা "যেমন" আচরণ করে।
টমাস

1
@ থমাস এর অর্থ এই নয় যে আপনি ও_এপিপেন্ডেন্ডের জন্য ডকুমেন্টেড সমস্ত আচরণ পেয়ে যাবেন, যার অর্থ প্রতিটি লেখার শেষে অবস্থিতকরণ। "যেমন" হ'ল কেবলমাত্র স্ট্যান্ডার্ড ভার্বায়েজ যা উদাহরণস্বরূপ এটি অপ্রথাগত-ইউনিক্স প্ল্যাটফর্মগুলিতে ওপেন () ফাংশনটি কল করা ছাড়া অন্য কোনও উপায়ে খোলার অনুমতি দেয়।
র্যান্ডম 832

এই আচরণটি মানদণ্ডে রয়েছে তা দেখানোর জন্য +1।
প্রেম

32

উত্সটি অনুসন্ধান করে, এটি O_APPEND ব্যবহার করে। মধ্যে ব্যাশ 4.3.30 জন্য make_cmd.cলাইন 710-713 পড়ুন:

case r_appending_to:                /* >>foo */
case r_append_err_and_out:          /* &>> filename */
  temp->flags = O_APPEND | O_WRONLY | O_CREAT;
  break;

উত্স কোডের দৃষ্টিকোণ থেকে উত্তরটি দেখানোর জন্য +1।
প্রেম

19

আসুন অনুসন্ধান করুন যে straceকোনও স্থানীয় (এনএনএফএস) ফাইল সিস্টেম ব্যবহার করে:

$ strace -eopen -- bash -c "echo foo >> /tmp/testfile000" 2>&1 | grep /tmp/testfile000
open("/tmp/testfile000", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3

$ strace -eopen -- bash -c "echo foo > /tmp/testfile000" 2>&1 | grep /tmp/testfile000
open("/tmp/testfile000", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3

অন্যান্য শাঁস, যথা dash, dash, shbusybox- র 'এবং mkshএকই এইরকম আচরণ।

বিকল্পটির -e openঅর্থ -e trace=openকেবলমাত্র open()সিস্টেম কলটি চিহ্নিত করা।

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