/ dev / stderr বনাম> & 2 এ আউটপুট প্রেরণ করা হচ্ছে


11

স্ক্রিপ্টগুলিতে, ত্রুটিগুলি সাধারণত ডেস্ক্রিপ্ট 2 ফাইলের সাথে প্রেরণ করা হয় &2, অর্থাত:

echo "error" >&2

কখনও কখনও /dev/stderrপরিবর্তে ব্যবহৃত হয়:

echo "error" > /dev/stderr 

এদিকে তাকিয়ে /dev/stderrআমি দেখতে পাচ্ছি যে এটি কেবলমাত্র একটি সিমলিংক /proc/self/fd/2, যা পরিবর্তিতভাবে /dev/pts/5(আমার বর্তমান টার্মিনালটিতে) একটি সিমিলিংক ।

জটিল কিছুটা মনে হচ্ছে। এর পিছনে কি কিছু যুক্তি আছে?

ব্যবহার /dev/stderrএবং &2সমতুল্য?

এগুলির মধ্যে কি অন্যের চেয়ে বেশি পছন্দ হয়?


3
echo "error" >2নাম 2এবং বিষয়বস্তু সহ একটি ফাইল তৈরি করে error
সাইরাস


আমি আমার সম্পাদনাটি আবার পরিবর্তিত হয়ে 2 টি পরিবর্তে 2 টি দেখতে পেয়েছি? আপনার প্রশ্নটি আসলে >2, বা ব্যবহারের বিষয়ে >&2?
জেফ শ্যাচলার

উত্তর:


13

বিশেষ ডিভাইস /dev/stderrসিস্টেম-নির্দিষ্ট, যখন ফাইল বর্ণনাকারী 2(বিশেষ ডিভাইস নয় /proc/self/fd/2) বহনযোগ্য। আপনি যদি নন-পোর্টেবল কোডটি লিখতে চান তবে এই বিশেষ ডিভাইসগুলি শুরু করার জন্য ভাল জায়গা।

এখানে কয়েকটি সিস্টেম রয়েছে /dev/stderr: লিনাক্স অবশ্যই এবং ওএসএক্স । তবে ওএসএক্সের কোনও /procফাইল সিস্টেম নেই এবং এটির /dev/stderrএকটি লিঙ্ক /dev/fd/2

আরও পড়া:


এছাড়াও কেস যেমন কেউ করতে চান ক্ষেত্রে আছে। এটি 2> bla.logযা 2হার্ড-কোড না হিসাবে আপনি পাইপ করবেন ততক্ষণ কাজ করবে /dev/stderr। মূলত আউটপুট হওয়ার দরকার2 নেই । stderr
লার্কি

6

ব্যাশ, এবং অন্যান্য শাঁস সালে পুনর্নির্দেশ কিছু উপায় করার মান ত্রুটি ব্যবহার করা >&2ফাইল বর্ণনাকারী/dev/stderr হিসাবে বাশ খোলে । ফাইল বর্ণনাকারীদের দ্বারা বর্ণনাকারীর সংখ্যা কোথায় রয়েছে তা উল্লেখ করা হয় । সুতরাং, স্ট্যান্ডার্ড ত্রুটিতে মুদ্রণ করা হবে । 2&NNecho error >&2error/dev/stderr

এটি /dev/stdoutফাইল বর্ণনাকারী হিসাবেও খুলবে 1। এর অর্থ আপনি করতে পারেন echo output >&1। যাইহোক, যেহেতু সবকিছুই ডিফল্টরূপে স্ট্যান্ডার্ড আউটপুটে মুদ্রিত হয়, এটি echo outputনিজেই একই ।

এখন, 2>অন্যরকম। এখানে, আপনি অন্য কোথাও একটি কমান্ডের ত্রুটি আউটপুট পুনর্নির্দেশ করছেন। সুতরাং, এর 2>fileঅর্থ "ফাইলের জন্য মুদ্রিত যে কোনও কিছু পুনরায় ডাইরেক্টর করুন ফাইল 2 (স্ট্যান্ডার্ড ত্রুটি) এ file"।


3

আপনি ঠিক বলেছেন, >&2আরও প্রত্যক্ষ এবং নিখুঁতভাবে "প্রতিমা"। সেগুলি সমতুল্য হওয়া উচিত, সুতরাং ব্যবহারের কোনও বিশেষ কারণ নেই >/dev/stderr। এগুলি বাদে, যদি কেউ পড়েন তবে এটি কী করে তা জানেন না, তবে তাদের মধ্যে একটির অন্যটির থেকে সম্ভবত খুঁজে পাওয়া সহজ :-)। তবে সাধারণভাবে আমি আপনাকে ব্যবহারের পরামর্শ দিই >&2

/ dev / stderr কার্যকর হতে পারে যখন প্রোগ্রামগুলি একটি নির্দিষ্ট ফাইল নামটিতে ত্রুটি লিখবে, তবে stderr সমর্থন করে না। স্পষ্টতই এটি কিছুটা স্বীকৃত; / dev / stdout অনেক বেশি দরকারী। (আমি সম্প্রতি পেয়েছি যে mysql_safeমোড়কের স্ক্রিপ্টটি কনসোলে ত্রুটিগুলি লিখবে না; দুর্ভাগ্যক্রমে এটি ত্রুটি লগ ফাইলে অনুমতিগুলিও পরিবর্তন করতে চায়, সুতরাং / dev / stderr ব্যবহার করে কয়েকটি অতিরিক্ত অতিরিক্ত সতর্কবার্তা দেখা দেয়)।

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