স্ট্যান্ডআউট এবং স্টডারকে ফাইল বর্ণনামূলক অনুলিপি ছাড়াই একই ফাইলে পুনঃনির্দেশ করা নিরাপদ?


27

আমি খালি ডিরেক্টরিতে শুরু।

$ touch aFile
$ ls
aFile

তারপরে আমি lsদুটি যুক্তি, যার একটি এই ডিরেক্টরিতে নেই। আমি উভয় আউটপুট স্ট্রিমগুলি নামের একটি ফাইলে পুনঃনির্দেশ করি output। আমি >>একই সাথে লেখা এড়ানোর জন্য ব্যবহার করি ।

$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile

যা কাজ বলে মনে হচ্ছে। এই পদ্ধতির কি কোনও বিপদ আছে?


6
এটি একটি দ্রুত ডাউন ভোট ছিল। পাঁচ সেকেন্ডের মতো লাগল। আপনি কি আমাকে বলতে পারেন যে কীভাবে আপনি আমার প্রশ্নের যথাযথ মূল্যায়ন এত তাড়াতাড়ি করতে পারেন? এবং আরও ভাল, এটিতে কী ভুল হয়েছে যাতে আমি এটি উন্নতি করতে পারি?
প্রস্থান_স্তাতাস

আপনি ls aFile not_exist &>>outputএখানে কেন আরও মান ব্যবহার করবেন না ? (দ্রষ্টব্য, আমি ধরে নিচ্ছি আপনি বাশ ব্যবহার করছেন ।)
ফেডনকাদিফেলি

5
কারণ এটি আমাকে কী জিজ্ঞাসা করছে তা বুঝতে সহায়তা করে না। আমি জানি কীভাবে এই স্ট্রিমগুলি একই ফাইলে পুনঃনির্দেশ করা যায়, এমনকি পোর্টেবলও even আমি যা জানতে চাই তা হ'ল আমি প্রশ্নে যা পরামর্শ দিয়েছি তাতে কোনও সমস্যা আছে কিনা। @ ফেডনকাডিফেলি
প্রস্থান_স্তাতাস

1
@ ফেডনকাডিফেলি &>>মানক নয়। এটি একটি পছন্দসই, অস্পষ্ট সিনট্যাক্স যা বিভিন্ন শেলের মধ্যে আলাদাভাবে কাজ করে। আমি অবাক হলাম আপনি ছেলেরা কোথা থেকে আপনার জিনিসগুলি পাবেন।
চাচা বিলি

4
বাশ কোনও মানদণ্ড নয়ls &>>foo ...পসিক্স স্ট্যান্ডার্ড আদেশগুলি যা দুটি কোমন্ড হিসাবে পার্স করা উচিত ls &এবং উবুন্টু থেকে >>foo ...অন্য শেলগুলি এইভাবে /bin/shপার্স করছে। এটি অবমানিত হওয়ার জন্য, আপনি এখানে দেখতে পারেন - যদিও আমি এটির কোনও ধরণের কর্তৃত্ব করি না। bashযদিও রক্ষণাবেক্ষণকারীদের তারা যদি একটি ভাল ধারণাটি ব্যবহার করার বিষয়ে বিবেচনা করে তবে তা জিজ্ঞাসা করতে পারেন ।
চাচা বিলি

উত্তর:


22

না, এটি স্ট্যান্ডার্ডের মতো নিরাপদ নয় >>bar 2>&1

আপনি যখন লিখছেন

foo >>bar 2>>bar

আপনি দুটি barবারের সাথে O_APPENDপৃথক পৃথক পৃথক ফাইল বস্তু [1] তৈরি করে প্রতিটি তার নিজস্ব রাষ্ট্র (পয়েন্টার, ওপেন মোডগুলি ইত্যাদি) দিয়ে ফাইলটি খুলছেন।

এটি একেবারে বিপরীত 2>&1যা কেবলমাত্র dup(2)সিস্টেম কলকে কল করে, এবং একই ফাইল অবজেক্টের জন্য স্টেডার এবং স্টডআউটকে আদানপ্রদানযোগ্য উপকরণ তৈরি করে।

এখন, এতে একটি সমস্যা আছে:

O_APPENDযদি একাধিক প্রক্রিয়া একবারে একটি ফাইলে ডেটা সংযুক্ত করে তবে এনএফএস ফাইল সিস্টেমগুলিতে দূষিত ফাইলগুলি হতে পারে। এটি কারণ এনএফএস কোনও ফাইল সংযোজন সমর্থন করে না, তাই ক্লায়েন্ট কার্নেলটিকে এটি অনুকরণ করতে হবে, যা কোনও রেস শর্ত ছাড়াই করা যায় না।

আপনি সাধারণতঃ মত ফাইলের সম্ভাব্যতা উপর নির্ভর করতে পারেন barমধ্যে foo >>bar 2>&1দুটি পৃথক বেশ কম হচ্ছে স্থান থেকে একই সময়ে লেখা হচ্ছে। কিন্তু আপনার দ্বারা >>bar 2>>barআপনি কোনও কারণ ছাড়াই মাত্র এক ডজন আদেশ দ্বারা এটি বাড়িয়েছেন।

[1] পসিক্স লিংগোতে "ফাইলের বিবরণ খুলুন"।


3
সাধারণত, অ্যাপেন্ড-মোড ফাইলগুলির জন্য, এটি নিরাপদ । উদ্ধৃত ইস্যুটি এনএফএসের একটি বাগ যা এটি ফাইল সিস্টেম হিসাবে অনুপযুক্ত (নন-পসিক্স-কনফর্মিং) করে তোলে। নন-অ্যাপেন্ড-মোড ক্ষেত্রে, যদিও এটি কখনও নিরাপদ নয়।
আর ..

1
এটাই নিষ্কলুষ। ওপির ডাবল-অ্যাপেন্ড ব্যবহার করা নিরাপদ নয় (সম্পূর্ণ অর্থহীন ছাড়াও)। এবং O_APPENDযাইহোক যাইহোক এক ধরণের ধরণের - সঠিকভাবে বাস্তবায়নের জন্য বেশ সাহসী।
মশভী

আমি বিশ্বাস করি যে এনএফএস রেসের শর্তটি কেবলমাত্র বিভিন্ন ক্লায়েন্টের মধ্যে। ক্লায়েন্ট ওএসের সমস্ত প্রক্রিয়াগুলির মধ্যে সমস্ত লেখার সমন্বয় করা উচিত।
বার্মার

@ বারমার এটি সত্য হবে যদি ক্লায়েন্ট ওএস কেবল কোনও এনএফএস ফাইলের নিজস্ব দৃষ্টিভঙ্গির যত্ন করে। তবে যখন এনএফএস ফাইল দিয়ে লেখার সাথে সাথে খোলার সাথে সাথে O_APPENDক্লায়েন্টটি প্রথমে সার্ভার থেকে ফাইলের "আসল" আকারটি পুনরুদ্ধার করবে ("পুনঃনির্মাণ" ইনোড) এবং তারপরে অনুসন্ধান + লিখুন + ক্যাশেড ইনোড আপডেট করবে এবং কেবল শেষ অংশটি হবে লক অধীনে সম্পন্ন হয়েছে, যার অর্থ প্রথম অংশটি এখনও সার্ভার থেকে একটি বাসি আকারটি পেতে পারে এবং স্থানীয় / ক্যাশেড ইনোড থেকে সঠিকটিকে ওভাররাইড করতে পারে ide একই সমস্যা lseek(SEEK_END)
মশবী

আমি এখনও দেখতে পাচ্ছি না কীভাবে এটি একই ক্লায়েন্টের দুটি স্ট্রিমের মধ্যে রেসের পরিস্থিতি তৈরি করতে পারে। উভয় স্ট্রিমের একই স্থানীয় ক্যাশেড ইনোড উল্লেখ করা উচিত।
বার্মার

22

আপনি যখন কি করবেন

some_command >>file 2>>file

এটি যে fileদুটিবার সংযোজন করার জন্য খোলা হবে। এটি কোনও পসিক্স ফাইল সিস্টেমে করা নিরাপদ। স্ট্যান্ডিং আউটপুট স্ট্রিম বা স্ট্যান্ডার্ড ত্রুটি প্রবাহের উপরে ডেটা আসে কিনা তা বিবেচনা না করেই ফাইল সংযোজনের জন্য খুললে ফাইলটিতে যে কোনও লিখন ঘটে যা ফাইলের শেষে ঘটবে।

এটি অন্তর্নিহিত ফাইল সিস্টেমে পারমাণবিক সংযুক্তি লেখার ক্রিয়াকলাপের উপর নির্ভর করে। কিছু ফাইল সিস্টেম, যেমন এনএফএস, পারমাণবিক সংযোজন সমর্থন করে না। উদাহরণস্বরূপ, স্ট্যাকওভারফ্লোতে "ইউনিক্স-এ ফাইল অ্যাপেন্ড অ্যাটমিক?" প্রশ্নটি দেখুন।

ব্যবহার

some_command >>file 2>&1

এমনকি এনএফএসে কাজ করবে।

তবে, ব্যবহার

some_command >file 2>file

নিরাপদ নয়, যেহেতু শেল আউটপুট ফাইলটি (দুইবার) কেটে ফেলবে এবং যে কোনও লেখায় যে দুটি প্রবাহই ঘটে তা অন্য স্ট্রমে ইতিমধ্যে লিখিত ডেটা ওভাররাইট করবে ।

উদাহরণ:

$ { echo hello; echo abc >&2; } >file 2>file
$ cat file
abc
o

helloস্ট্রিং (ক সসীম রাখুন NEWLINE) প্রথম লিখিত হয়, এবং তারপর স্ট্রিং abcএকটি newline দ্বারা অনুসরণ মান ত্রুটি থেকে লেখা আছে, মুছে যাওয়ার hell। ফলাফলটি abcএকটি নতুন লাইনের সাথে স্ট্রিং , তারপরে প্রথম echoআউটপুটটি কী, একটি oএবং একটি নতুন লাইন থাকে by

echoক্ষতস্থানের কাছাকাছি দুটি অদলবদল কেবল helloআউটপুট ফাইলে উত্পাদন করে কারণ সেই স্ট্রিংটি সর্বশেষে লেখা থাকে এবং abcস্ট্রিংয়ের চেয়ে দীর্ঘ হয় । পুনঃনির্দেশগুলি যে ক্রম হয় সেটির কোনও বিষয় নয়।

আরও idiomatic ব্যবহার করা আরও ভাল এবং নিরাপদ হবে

some_command >file 2>&1

1
যদিও আধুনিক শেলগুলির ক্ষেত্রে এটি সত্য, বর্ন বা থমসন শেলের ক্ষেত্রে এটি ছিল না (যেখানে >>এসেছে), যেখানে >>লেখার জন্য উন্মুক্ত হবে এবং শেষ পর্যন্ত সন্ধান করতে হবে (আমি মনে করি কারণ ও_এপিপিএন্ড তখনও উদ্ভাবিত হয়নি)। এমনকি সোলারিস 10, /bin/sh -c '(echo a; echo b >&2) >> file 2>> file; cat file'আউটপুট b
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস কি এটি সোলারিস 10 এর বাস্তবায়ন shবা এর ফাইল সিস্টেমের সাথে সমস্যা?
কুসালানন্দ

1
এটি >>মূলত যা করছিল, এটি ও_এপিপিএন্ডের সাথে খোলেনি, এটি বাইরে খোলে এবং শেষের দিকে চেয়েছিল। এটি এতটা সমস্যা নয়, এটি যা করছিল তা করার এবং নথিভুক্ত করার জন্য।
স্টাফেন চেজেলাস

0

এটি আপনি কী অর্জন করতে চান তা নির্ভর করে। আউটপুট হিসাবে একই ফাইলে ত্রুটি থাকা কি ঠিক হবে তা সিদ্ধান্ত নেওয়ার জন্য আপনার উপর নির্ভর করে। এটি কেবল শেলের কার্যকারিতা সহ একটি ফাইলে পাঠ্য সংরক্ষণ করছে যা আপনার ইচ্ছামতো আপনাকে পুনঃনির্দেশ করতে দেয়। কোনও নিখুঁত হ্যাঁ বা না রয়েছে। লিনাক্সের সমস্ত কিছু এটি বিভিন্ন উপায়ে করা যেতে পারে, এইভাবে আমার ls notExistingFile existingFile >> output 2>&1 প্রশ্নের উত্তর দেওয়ার: নিজেই পুনঃনির্দেশের দিক থেকে, হ্যাঁ এটি পুরোপুরি নিরাপদ।


আপনি এখানে যা বলছেন তার চেয়ে আরও অনেক কিছুই রয়েছে। >পরিবর্তে একই ব্যায়াম >>কিছু অক্ষর ওভাররাইট হবে। সুতরাং এটি শেলটি আমাকে পুনর্নির্দেশের অনুমতি দেয় কেবল তাই নয়, কারণ আমি যখন পুনঃনির্দেশ করি তখন >ফলাফলটি ভিন্ন হয়। সুতরাং সঙ্গে बारीक আছে >, সঙ্গে কিছু আছে >>?
প্রস্থান_স্তাতাস

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