Stdout এবং stderr কে একটি ফাইলে পুনর্নির্দেশ করবেন এবং কনসোলের জন্য stderr প্রদর্শন করবেন?


18

আমি জানি যে কীভাবে কোনও ফাইলে পুনর্নির্দেশ করতে হয়, এবং টি ব্যবহার করতে হয়; একটি বেসিক স্তরে সুতরাং

$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.

$ outanderr 1>file      # redirect stdout to a file, display stderr
stderr

$ outanderr 2>file      # redirect stderr to a file, display stdout
stdout

$ outanderr 1>file 2>&1 # redirect both to a file, display nothing

$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout

$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr

প্রশ্নটি হ'ল: নীচের আউটপুটটি পেতে প্রশ্নের চিহ্নের জায়গায় কী লিখবেন:

$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr

Constaints:

  • ধরে নেওয়া বাশ।
  • অর্ডারটি ফাইলটিতে রাখতে হবে।
  • stderr বিষয়বস্তু লাইন দ্বারা রিয়েল টাইম লাইনে প্রদর্শিত হয়, অর্থাত্ কোনও বাফারিং নয়।
  • পৃথক স্ক্রিপ্ট ফাইলগুলি ব্যবহার করা যেতে পারে।
  • যাদু প্রয়োজন হতে পারে।

আপনার outanderrপ্রোগ্রামটির কতটা নিয়ন্ত্রণ রয়েছে ?
কেভিন

1
@ কেভিন আমাকে মনে হয় যে প্রশ্নটি এর চেয়ে বেশি জেনেরিক। এখানে, outanderrকেবলমাত্র একটি উপনাম যা স্টাডাউটের জন্য একটি লাইন এবং স্টারডারে আরেকটি মুদ্রণ করে। ধারণাটি (এটি সম্ভব হলে) হ'ল একটি জেনেরিক সমাধান তৈরি করা যা কোনও প্রোগ্রামের সাথে কোনও সংশোধন না করেই কাজ করতে পারে।
দীর্ঘদিন

@ লার্জেট আমি এটি বুঝতে পেরেছি, তবে আমি বিশ্বাস করি না যে জেনেরিক সমাধানে সমস্ত সীমাবদ্ধতার কঠোরভাবে পূরণ করা সম্ভব, তাই আমি দেখছিলাম যে আমরা কোনও নির্দিষ্ট পেতে পারি কিনা।
কেভিন

@ ইজর্জেট ঠিক আছে
TWiStErRob

উত্তর:


12
2>&1 >>outputfile | tee --append outputfile

সহজ পরীক্ষার জন্য:

echo -n >outputfile; bash -c "echo stdout >&1; echo stderr >&2" 2>&1 >>outputfile |
  tee --append outputfile; echo "outputfile:"; cat outputfile

সম্পাদনা 1:

এটি স্টাইডআউট (কেবল) ফাইলে লেখার মাধ্যমে কাজ করে, স্টেরআউট স্টাডাউট তৈরি করে যাতে এটি পাইপের মধ্য দিয়ে যায়, এবং টি-তে একই ফাইলটিতে তার আউটপুট লিখতে পারে।

উভয় লেখাগুলি অবশ্যই অ্যাপেন্ড মোডে করা উচিত ( >>পরিবর্তে >) অন্যথায় উভয়ই একে অপরের আউটপুটকে ওভাররাইট করে।

পাইপটি বাফার হিসাবে কোনও গ্যারান্টি নেই যে আউটপুটটি সঠিক ক্রমে ফাইলটিতে প্রদর্শিত হবে। এমনকি যদি কোনও অ্যাপ্লিকেশন উভয় ফাইল বর্ণনাকারী (দুটি পাইপ) এর সাথে সংযুক্ত থাকে তবে এটি পরিবর্তিত হবে না। গ্যারান্টিযুক্ত আদেশের জন্য উভয় আউটপুটকে একই চ্যানেল দিয়ে যেতে হবে এবং যথাক্রমে চিহ্নিত করতে হবে। অথবা আপনার কিছু সত্যই অভিনব জিনিস প্রয়োজন:

  1. যদি stdout এবং stderr উভয়ই একটি ফাইলে পুনর্নির্দেশ করা হয় (একই ফাইল নয়!) এবং উভয় ফাইলই FUSE ভলিউমে থাকে তবে FUSE মডিউল প্রতিটি লেখাকে টাইমস্ট্যাম্পের সাথে চিহ্নিত করতে পারে যাতে দ্বিতীয় অ্যাপ্লিকেশনটি সঠিকভাবে ডেটা বাছাই করতে পারে এবং এটি একত্রিত করতে পারে আসল আউটপুট ফাইলের জন্য। অথবা আপনি ডেটা চিহ্নিত করেন না তবে মডিউলটি সম্মিলিত আউটপুট ফাইল তৈরি করুন। সম্ভবত এখনও কোনও ফুস মডিউল নেই যা এটি করে ...
  2. Stdout এবং stderr উভয়ই নির্দেশিত হতে পারে /dev/null। অ্যাপ্লিকেশনটির আউটপুটগুলি এটির মাধ্যমে চালিয়ে আলাদা করা হবে strace -f -s 32000 -e trace=write। সেক্ষেত্রে আপনাকে পালাতে হবে verse বলা বাহুল্য যে অ্যাপ্লিকেশনটি ট্রেস করে দ্রুত চালিত হয় না।
  3. সম্ভবত বিদ্যমান, সাধারণ ফুস মডিউল ব্যবহার করে এবং অ্যাপ্লিকেশনটির পরিবর্তে মডিউলটি ট্রেস করেও এটি পৌঁছতে পারে। এটি অ্যাপ্লিকেশনটি সনাক্ত করার চেয়ে দ্রুত হতে পারে কারণ (অথবা বরং: যদি) মডিউলটির কাছে অ্যাপ্লিকেশনটির চেয়ে সম্ভবত অনেক কম স্কাইল রয়েছে।
  4. যদি অ্যাপ্লিকেশনটি নিজেই সংশোধন করা যায়: অ্যাপ্লিকেশনটি প্রতিটি আউটপুট পরে থামানো যেতে পারে (তবে আমি মনে করি এটি কেবল কেবল অভ্যন্তর থেকে সম্ভব) এবং কেবলমাত্র সিগন্যাল প্রাপ্ত হওয়ার পরে (সিগুসআর 1 বা সিগকন্ট)। পাইপ থেকে অ্যাপ্লিকেশন রিডিংয়ে নতুন ডেটার জন্য পাইপ এবং ফাইল উভয়ই পরীক্ষা করতে হবে এবং প্রতিটি নতুন তথ্যের পরে সংকেত প্রেরণ করতে হবে। অ্যাপ্লিকেশন ধরণের উপর নির্ভর করে এটি স্ট্রেস পদ্ধতির চেয়ে দ্রুত বা এমনকি ধীর হতে পারে। FUSE সর্বাধিক গতির সমাধান হবে।

1
বাঃ। ঠিক কেন উত্তর দিচ্ছেন না ঠিক একই উত্তর লেখার মাঝখানে আমাকে ধরুন।
কেভিন

2
এনবি এটির একটি রেস শর্ত রয়েছে যা ল্যাপটপ / ভুলের লাইনগুলি পরিবর্তনের সম্ভাবনা প্রবর্তন করে তবে আমি এটিকে এড়াতে পারি বলে মনে করি না।
কেভিন

1
@ কেভিন এটি আমাদের সেরা ক্ষেত্রে ঘটেছিল, আমি এর আগেও এর মধ্যে ভুগছিলাম এবং প্রায় "একজন আমাকে দেখান যে কেউ লিখছেন" বৈশিষ্ট্যটি চেয়েছিল (যা জটিল হবে)। আমার কাছে মনে হচ্ছে কেবল পাইপলাইনে লেখার পরে ফাইলটিতে (stdout) কোনও লেখার ঘটনা ঘটে তবেই রেসের অবস্থা ঘটে।
হাউক লেগেইন

পাঠাতে উভয় যে হবে stdoutএবং stderrকরতে tee, অথবা আমি কিছু অনুপস্থিত করছি? আমি মনে করি ওপি-র প্রয়োজনীয়তা tee stderrকেবলমাত্র।
জোসেফ আর।

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