রুবিতে $stdout(ডলারের চিহ্ন দ্বারা পূর্ববর্তী) এবং STDOUT(সমস্ত ক্যাপে) মধ্যে পার্থক্য কী ? আউটপুট পুনর্নির্দেশ করার সময় কোনটি ব্যবহার করা উচিত এবং কেন? একই জন্য $stderrএবং STDERR।
সম্পাদনা: সবেমাত্র একটি সম্পর্কিত প্রশ্ন পাওয়া গেছে ।
রুবিতে $stdout(ডলারের চিহ্ন দ্বারা পূর্ববর্তী) এবং STDOUT(সমস্ত ক্যাপে) মধ্যে পার্থক্য কী ? আউটপুট পুনর্নির্দেশ করার সময় কোনটি ব্যবহার করা উচিত এবং কেন? একই জন্য $stderrএবং STDERR।
সম্পাদনা: সবেমাত্র একটি সম্পর্কিত প্রশ্ন পাওয়া গেছে ।
$stdoutএবং STDOUTবনাম $stdinএবং STDINsymetrical হয়, মধ্যে পার্থক্য $stdoutএবং $>বনাম $stdinএবং $<নয়।
উত্তর:
$stdoutএকটি বৈশ্বিক পরিবর্তনশীল যা বর্তমান স্ট্যান্ডার্ড আউটপুটকে উপস্থাপন করে। STDOUTএকটি ধ্রুবক প্রতিনিধিত্বমূলক স্ট্যান্ডার্ড আউটপুট এবং সাধারণত এর ডিফল্ট মান $stdout।
STDOUTধ্রুবক হওয়ার সাথে সাথে আপনার এটিকে পুনরায় সংজ্ঞায়িত করা উচিত নয়, তবে আপনি $stdoutত্রুটি / সতর্কতা ছাড়াই পুনরায় সংজ্ঞা দিতে STDOUTপারবেন (পুনরায় সংজ্ঞায়নের ফলে একটি সতর্কতা বাড়বে)। উদাহরণস্বরূপ, আপনি এটি করতে পারেন:
$stdout = STDERR
একই জন্য $stderrএবংSTDERR
সুতরাং, আপনার প্রশ্নের অন্য অংশের উত্তর দিতে, আউটপুট পুনর্নির্দেশের জন্য গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করুন, ধ্রুবকগুলি নয়। আপনার কোডে এটিকে আরও পরিবর্তন করতে সচেতন হোন, বৈশ্বিক ভেরিয়েবলগুলি পুনরায় সংজ্ঞায়িত করা আপনার আবেদনের অন্যান্য অংশগুলিকে প্রভাবিত করতে পারে।
$>, ডিফল্ট আউটপুট স্ট্রিমটি নয় $stdout।
$stdoutএবং $>এটি عرفীয় হয়, সুতরাং একটিকে পুনর্নির্দিষ্ট করা অন্যটিকে প্রভাবিত করবে।
IO#reopenক্ষেত্রে এটি ব্যবহার করা ভাল $stdout? আমি এই মতামত সাথে সম্পূর্ণই একমত। $stdout.reopenপদ্ধতি mutates তার রিসিভার ও যে প্রভাবিত করবে STDOUTযদি তোমরা পুনরায় নির্ধারণ করেন নি $stdoutআগে। এগুলি প্রতিশব্দ হিসাবে বোঝানো হয় না, দায়িত্বের কারণে তারা যখন বিভিন্ন মান ধরে রাখে এবং STDOUTআপনার উদ্দেশ্যটি ভেঙে আবার খোলে তখন কিছুই খারাপ হয় না ।
STDOUT এটি একটি বিশ্বব্যাপী ধ্রুবক, সুতরাং এটি পরিবর্তন করা উচিত নয়। $stdout একটি পূর্বনির্ধারিত পরিবর্তনশীল, তাই এটি পরিবর্তন করা যায়।আপনি যদি পুনঃনির্দেশ করতে শেলটি ব্যবহার করেন:
$ ruby test.rb > test.log
তবে আপনার স্ক্রিপ্টের জন্য ফাইল বর্ণনাকারী হিসাবে আপনি কোনটি ব্যবহার করবেন তা আপনার স্ক্রিপ্ট কার্যকর হওয়ার আগে নির্ধারিত হচ্ছে তা বিবেচ্য নয়।
তবে, আপনি যদি নিজের রুবি স্ক্রিপ্টের মধ্য থেকে ওএসের এসটিডিউটের জন্য ফাইল বিবরণী পরিবর্তন করার চেষ্টা করছেন, উদাহরণস্বরূপ, সপ্তাহের বর্তমান দিনের উপর ভিত্তি করে লগ ফাইলগুলির একটি ঘূর্ণায়মান সেটটিতে আউটপুট প্রেরণ করার জন্য, তবে আপনি নিশ্চিত করতে চাইবেন আপনি ব্যবহার $stdout।
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
উভয় $stdoutএবং STDOUTবিভিন্ন অর্থ আছে। এই বিষয়টিতে রুবির ডকুমেন্টেশন বেশ স্পষ্ট:
$stdout- বর্তমান মান আউটপুট।STDOUT- স্ট্যান্ডার্ড আউটপুট। স্ট্যান্ডআউটের জন্য ডিফল্ট মান।
আপনি যখন স্ট্যান্ডার্ড আউটপুটটিতে লিখতে চান, তখন আপনি প্রকৃতপক্ষে বর্তমান স্ট্যান্ডার্ড আউটপুটটি বোঝাতে চান , সুতরাং আপনার এটি লিখতে হবে $stdout।
STDOUTখুব অকেজো না। এটি এর জন্য ডিফল্ট মান সংরক্ষণ করে $stdout। যদি আপনি কখনও পুনরায় নিয়োগ করেন $stdoutতবে আপনি এটির সাথে পূর্ববর্তী মানটিতে পুনঃস্থাপন করতে পারেন $stdout = STDOUT।
তদতিরিক্ত, আরও একটি পূর্বনির্ধারিত পরিবর্তনশীল রয়েছে:
$>- মুদ্রণ, প্রিন্টফের জন্য ডিফল্ট আউটপুট যা$stdoutপূর্বনির্ধারিত।
তবে এটি রুবি ২.৩-এর মতো দেখায় এটি কেবল একটি উপাধিকার হিসাবে আচরণ করে $stdout। পুনরায় বরাদ্দকরণ এর বিপরীতে $stdoutএর মান পরিবর্তন করে $>।