রুবির স্টাডাউট এবং এসটিডিউটের মধ্যে পার্থক্য


91

রুবিতে $stdout(ডলারের চিহ্ন দ্বারা পূর্ববর্তী) এবং STDOUT(সমস্ত ক্যাপে) মধ্যে পার্থক্য কী ? আউটপুট পুনর্নির্দেশ করার সময় কোনটি ব্যবহার করা উচিত এবং কেন? একই জন্য $stderrএবং STDERR

সম্পাদনা: সবেমাত্র একটি সম্পর্কিত প্রশ্ন পাওয়া গেছে ।



@ থিনমান কিছুটা এটি একটি সদৃশ। তবে এটি উল্লেখ করা হবে যে পার্থক্য যেহেতু $stdoutএবং STDOUTবনাম $stdinএবং STDINsymetrical হয়, মধ্যে পার্থক্য $stdoutএবং $>বনাম $stdinএবং $<নয়।
স্কালে

উত্তর:


109

$stdoutএকটি বৈশ্বিক পরিবর্তনশীল যা বর্তমান স্ট্যান্ডার্ড আউটপুটকে উপস্থাপন করে। STDOUTএকটি ধ্রুবক প্রতিনিধিত্বমূলক স্ট্যান্ডার্ড আউটপুট এবং সাধারণত এর ডিফল্ট মান $stdout

STDOUTধ্রুবক হওয়ার সাথে সাথে আপনার এটিকে পুনরায় সংজ্ঞায়িত করা উচিত নয়, তবে আপনি $stdoutত্রুটি / সতর্কতা ছাড়াই পুনরায় সংজ্ঞা দিতে STDOUTপারবেন (পুনরায় সংজ্ঞায়নের ফলে একটি সতর্কতা বাড়বে)। উদাহরণস্বরূপ, আপনি এটি করতে পারেন:

$stdout = STDERR

একই জন্য $stderrএবংSTDERR


সুতরাং, আপনার প্রশ্নের অন্য অংশের উত্তর দিতে, আউটপুট পুনর্নির্দেশের জন্য গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করুন, ধ্রুবকগুলি নয়। আপনার কোডে এটিকে আরও পরিবর্তন করতে সচেতন হোন, বৈশ্বিক ভেরিয়েবলগুলি পুনরায় সংজ্ঞায়িত করা আপনার আবেদনের অন্যান্য অংশগুলিকে প্রভাবিত করতে পারে।


4
আসলে, আপনি যদি আউটপুট পুনর্নির্দেশ করতে চান, আপনার সম্ভবত ব্যবহার করা উচিত $>, ডিফল্ট আউটপুট স্ট্রিমটি নয় $stdout
Jörg ডব্লু মিটাগ

10
সবেমাত্র অন্য একটি প্রশ্নের উপর একটি মন্তব্য পাওয়া গেছে যা বলে $stdoutএবং $>এটি عرفীয় হয়, সুতরাং একটিকে পুনর্নির্দিষ্ট করা অন্যটিকে প্রভাবিত করবে।
jrdioko

9
@ জর্দিওকো: ঠিক বলেছেন। স্পষ্টতই, আমি কেবল প্রতিদিনই নতুন কিছু শিখি না, আমি প্রতিদিনও কিছু ভুলে যাই :-)
জার্গ ডব্লু মিট্টাগ

4
এবং আরও পড়তে, মনে হচ্ছে সহজ অ্যাসাইনমেন্টের পরিবর্তে IO # পুনরায় খোলা ব্যবহার করা ভাল ।
jrdioko

@jrdioko আপনি কেন মনে করেন যে এটির IO#reopenক্ষেত্রে এটি ব্যবহার করা ভাল $stdout? আমি এই মতামত সাথে সম্পূর্ণই একমত। $stdout.reopenপদ্ধতি mutates তার রিসিভার ও যে প্রভাবিত করবে STDOUTযদি তোমরা পুনরায় নির্ধারণ করেন নি $stdoutআগে। এগুলি প্রতিশব্দ হিসাবে বোঝানো হয় না, দায়িত্বের কারণে তারা যখন বিভিন্ন মান ধরে রাখে এবং STDOUTআপনার উদ্দেশ্যটি ভেঙে আবার খোলে তখন কিছুই খারাপ হয় না ।
স্কালে

5
  • STDOUT এটি একটি বিশ্বব্যাপী ধ্রুবক, সুতরাং এটি পরিবর্তন করা উচিত নয়।
  • $stdout একটি পূর্বনির্ধারিত পরিবর্তনশীল, তাই এটি পরিবর্তন করা যায়।

আপনি যদি পুনঃনির্দেশ করতে শেলটি ব্যবহার করেন:

$ ruby test.rb > test.log

তবে আপনার স্ক্রিপ্টের জন্য ফাইল বর্ণনাকারী হিসাবে আপনি কোনটি ব্যবহার করবেন তা আপনার স্ক্রিপ্ট কার্যকর হওয়ার আগে নির্ধারিত হচ্ছে তা বিবেচ্য নয়।

তবে, আপনি যদি নিজের রুবি স্ক্রিপ্টের মধ্য থেকে ওএসের এসটিডিউটের জন্য ফাইল বিবরণী পরিবর্তন করার চেষ্টা করছেন, উদাহরণস্বরূপ, সপ্তাহের বর্তমান দিনের উপর ভিত্তি করে লগ ফাইলগুলির একটি ঘূর্ণায়মান সেটটিতে আউটপুট প্রেরণ করার জন্য, তবে আপনি নিশ্চিত করতে চাইবেন আপনি ব্যবহার $stdout


4
"STDOUT একটি বিশ্বব্যাপী ধ্রুবক, সুতরাং এটি পরিবর্তন হবে না"। এটি একটি ধ্রুবক, যা পরিবর্তিত হতে পারে তবে একটি সতর্কতা জারি করা হবে। STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
টিন ম্যান

আহ্ হ্যাঁ, তাই "তাই এটি পরিবর্তন করা উচিত নয়" বলা উচিত। ধন্যবাদ!
shakerlxxv

5

উভয় $stdoutএবং STDOUTবিভিন্ন অর্থ আছে। এই বিষয়টিতে রুবির ডকুমেন্টেশন বেশ স্পষ্ট:

  • $stdout - বর্তমান মান আউটপুট।
  • STDOUT- স্ট্যান্ডার্ড আউটপুট। স্ট্যান্ডআউটের জন্য ডিফল্ট মান।

আপনি যখন স্ট্যান্ডার্ড আউটপুটটিতে লিখতে চান, তখন আপনি প্রকৃতপক্ষে বর্তমান স্ট্যান্ডার্ড আউটপুটটি বোঝাতে চান , সুতরাং আপনার এটি লিখতে হবে $stdout

STDOUTখুব অকেজো না। এটি এর জন্য ডিফল্ট মান সংরক্ষণ করে $stdout। যদি আপনি কখনও পুনরায় নিয়োগ করেন $stdoutতবে আপনি এটির সাথে পূর্ববর্তী মানটিতে পুনঃস্থাপন করতে পারেন $stdout = STDOUT

তদতিরিক্ত, আরও একটি পূর্বনির্ধারিত পরিবর্তনশীল রয়েছে:

  • $>- মুদ্রণ, প্রিন্টফের জন্য ডিফল্ট আউটপুট যা $stdoutপূর্বনির্ধারিত।

তবে এটি রুবি ২.৩-এর মতো দেখায় এটি কেবল একটি উপাধিকার হিসাবে আচরণ করে $stdout। পুনরায় বরাদ্দকরণ এর বিপরীতে $stdoutএর মান পরিবর্তন করে $>

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