শেল স্ক্রিপ্টগুলিতে স্টেডারারে পুনঃনির্দেশ কখন ব্যবহার করবেন


15

আমি জানি যে ভাল ব্যবহারযোগ্য ইউটিলিটিগুলি গ্রেড আউটপুট " স্ট্যান্ডআউটের " সাধারণ "বার্তা এবং স্টারডারে ত্রুটি বার্তাগুলির মতো।

$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory

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

আমি ভাল অনুশীলন সম্পর্কে জানতে চাই: স্ট্যাডারকে যখন কোনও বার্তা পুনঃনির্দেশিত করা হয় তখন যখন ডাকা হয় এবং যুক্তিসঙ্গত হয়, এবং কখন না?

"এটি নির্ভর করে", নিশ্চিত, তবে আপনার কি কিছু অন্তর্দৃষ্টি আছে যা আমাকে এই সিদ্ধান্ত নিতে সাহায্য করবে?

এই বিষয়গত প্রশ্নটি ফর্ম্যাটের সাথে মানানসই করার জন্য, আমি উত্তরগুলি উত্সাহিত করতে চাই যেগুলি "কেন" সম্বোধনের উত্তরগুলিকে উত্সাহিত করতে চাই এবং অভিজ্ঞতার দ্বারা এবং যদি সম্ভব হয় তবে সত্য দ্বারা সমর্থনিত উত্তরগুলি উত্সাহিত করতে চাই।


@ রশ এটিকে পুরোপুরি ব্যাখ্যা করেছেন। আমি সাধারণত দীর্ঘ স্ক্রিপ্টগুলির জন্য স্ট্ডারগুলিতে অগ্রগতি প্রতিবেদনগুলি মুদ্রণ করি।
টেরডন

উত্তর:


12

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

নীরবতা সোনার হয়। সবকিছু ঠিক থাকলে আউটপুট কিছুই না।

আমি ভাল অনুশীলন সম্পর্কে জানতে চাই: স্ট্যাডারকে যখন কোনও বার্তা পুনঃনির্দেশিত করা হয় তখন যখন ডাকা হয় এবং যুক্তিসঙ্গত হয়, এবং কখন না?

স্ট্ডআউট থেকে স্ট্ডারকে আলাদা করার সহজতম উপায়: আপনার সমস্ত স্ক্রিপ্ট আউটপুট পাইপের মাধ্যমে অন্য কমান্ডে পুনঃনির্দেশিত করা হবে তা কল্পনা করুন। সেক্ষেত্রে আপনার সমস্ত বিজ্ঞপ্তি স্ট্যাডারে রাখা উচিত, কারণ স্টাডআউটে এ জাতীয় অপ্রত্যাশিত তথ্য পাইপের অনুক্রমটিকে ভেঙে দিতে পারে।

এছাড়াও কখনও কখনও পাইপগুলিতে এটির মতো:

command1 | while read line ; do command2 ; done | command3

আপনার command2ব্যবহারকারীর আউটপুট থেকে কিছু পাস করতে হবে । অস্থায়ী ফাইল ব্যতীত সহজ উপায় হল স্ট্যাডার।


"একটি পাইপ কল্পনা করুন" ধারণার জন্য আপনাকে ধন্যবাদ। কখনও কখনও আমার কাছে স্ক্রিপ্টগুলি স্থাপন করা থাকে যা "বিজ্ঞপ্তি" ব্যতীত কিছুই করে না ( echoকিছু ভেরিয়েবল, কী করা হয়েছে তা দেখান, অগ্রগতি দেখান)। আমি স্ট্ডারটিতে সমস্ত কিছু রাখতে দ্বিধা করি কারণ এই লগিং বার্তাগুলি হ'ল সমস্ত স্ক্রিপ্ট কখনও আউটপুট হয়ে যায়। এই পরিস্থিতিতে পাইপ ধারণাটি কীভাবে প্রয়োগ করতে হবে তা সম্পর্কে আমি নিশ্চিত নই।
glts

1
@glts প্রোগ্রামগুলি সর্বদা পরিবর্তন ও উন্নত হচ্ছে। আপনি যে স্ক্রিপ্টগুলি উল্লেখ করেছেন সেগুলি এখন কোনও ডেটা আউটপুট দেয় না, সেগুলি পরে হতে পারে বা আপনি অন্যান্য স্ক্রিপ্টগুলির জন্য এটি সূচনা পয়েন্ট হিসাবে ব্যবহার করতে পারেন। আপনি যদি এই সম্মেলনটি শুরু করার জন্য অনুসরণ করেন তবে পরে আপনি অনেক কম চমক পাবেন। OTOH, আপনি যদি কেবল কোনও ফাইলের আউটপুট সংরক্ষণ করতে চান তবে আপনাকে স্ট্যাডারকে পুনর্নির্দেশ করতে হবে, সুতরাং এটি অন্য কিছুর মতো ট্রেড অফ।
জো

+1 অন্য একটি প্যারাফ্রেজ: নিশ্চিত করুন যে স্টডআউট সর্বদা মেশিন পঠনযোগ্য, বা কমপক্ষে একটি সামঞ্জস্যপূর্ণ ফর্ম্যাটে দরকারী পাঠ্য ডেটা রয়েছে।
ট্রিপলি

2

আমি সাধারণত অ্যাপ্লিকেশন অপারেশন সম্পর্কিত যা কিছু লিখি stderr, stdoutডেটা জন্য সংরক্ষিত।

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

অন্য অ্যাপ্লিকেশনটির জন্য আকর্ষণীয় হতে পারে বা আমার অ্যাপ্লিকেশনটির জন্য একটি পোস্টপ্রসেসর যা হতে চলেছে stdout, যা কেবলমাত্র আমার অ্যাপ্লিকেশনটির ইন্টারটার সাথে সম্পর্কিত stderr


0

আমার ব্যক্তিগত পছন্দটি হ'ল ত্রুটি বার্তা এবং ব্যতিক্রমগুলিতে stderrএবং তথ্যের বার্তাগুলিতে প্রেরণ stdout। আইএমও, stderrকোনও ব্যতিক্রম এবং তাই আমার কনভেনশন for

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