কিভাবে stderr এবং stdout বিভিন্ন ফাইলে পুনর্নির্দেশ এবং টার্মিনালে প্রদর্শিত হবে?


30

আমি টার্মিনালে একটি কমান্ডের আউটপুট দেখতে চাই যেন কোনও পুনঃনির্দেশ নেই। এছাড়াও, স্টারডারকে err.log এ পুনঃনির্দেশ করা প্রয়োজন এবং স্টাডআউটকে stdout.log এ পুনঃনির্দেশ করা দরকার।

টার্মিনালে যা দেখানো হয়েছে তার সঠিক অনুলিপিটি থাকা খুব ভাল হবে, যেমন ত্রুটিগুলি যখন মুদ্রিত হয় এবং এটি ঘটে তখন একটি পৃথক ফাইলে: stdouterr.log।


@ নুনো না এটি নয়। স্ট্যান্ডআউট এবং স্টডারারের জন্য ওপি বিভিন্ন ফাইল রাখতে চায়।
ডগবনে

@ ডগবনে হ্যাঁ, আপনি ঠিক বলেছেন। এর জন্যে দুঃখিত.
নুনো সি ইনসিও

আমি এখনও এই প্রশ্ন খুব পরিচিত। আমাকে দেখা যাক ... এখানে একটি খুব অনুরূপ একটি ইউনিক্স.স্ট্যাকেক্সেঞ্জারএইচওএইচ / 4195/250 , এবং এখানে সম্পর্কিত একটি ইউনিক্স.স্ট্যাকেক্সেঞ্জাং
ক /

উত্তর:


37

teeকমান্ডটি নিম্নরূপ ব্যবহার করুন :

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 আপনি কীভাবে স্ট্যাডার এবং স্টডআউটকে অদলবদল করতে পারেন, কারণ টি কেবল স্টডআউট গ্রহণ করতে পারে।

কটাক্ষপাত ইউনিক্স টী বর্ণের নাম কমান্ড ব্যবহার আরো উন্নত পুনঃনির্দেশগুলি জন্য tee


সুন্দর সমাধান সেন্টিমিডেটের প্রস্থান কোড পাওয়ার কোনও উপায় আছে কি?
টারবানফ অফ

2
প্রতিস্থাপন @turbanoff cmdসঙ্গে (cmd ; echo >exit_code.txt $?)
পার্থিয়ান শট 21

আমি বিশ্বাস করি এটি কমান্ড লাইনে জিনিসগুলির আউটপুট ((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
ক্রমকে

5

আমি মনে করি stdout এবং stderr দুটি পৃথক ফাইল লগ ইন একটি দুর্দান্ত ধারণা। এটি লগগুলি অ্যাসিক্রোনাস করে না? সুতরাং আমি নিম্নলিখিত চেষ্টা করে দেখেছি:

  • stdout to "stdout.log" (কুকুর বান যেমন প্রস্তাবিত)
  • stderror to "stderr.log" (কুকুর বানের পরামর্শ অনুসারে)
  • সমস্ত আউটপুট "all.log" এ এবং
  • এখনও প্রদর্শনটিতে আউটপুট দেখতে সক্ষম হবেন (যদিও আলাদা টার্মিনালে!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

অন্য টার্মিনালে

tail -f --sleep-interval=2 all.log

স্ট্যাডারকে সরাসরি দ্বিতীয় টিটিতে সরাসরি পরিচালনা করা কি সম্ভব নয়? তারপরে কোনও লগফিলের প্রয়োজন নেই।
স্টিভেন লু

@ স্টেভেনলু হ্যাঁ, আপনি যদি নামটি জানেন এবং দ্বিতীয় টিটিটি করা যায় যা লিখতে অনুমতি পান।
জেসেন

1
&| tee all.logকমান্ডের পরিবর্তে আরও সহজ হবে পরিবর্তে&> all.log
জেসেন

@ জেসেন: আমি দ্বিতীয়বার দেখছি &|। আমি বুঝতে পারছি &>, |&খুব, কিন্তু কি করে &|এই প্রেক্ষাপটে এর অর্থ কি? আমি নেটে নয়, একটি উপযুক্ত সিনট্যাক্স রেফারেন্স খুঁজে পাইনি, এমনকি ব্যাশ ম্যানুয়াল পৃষ্ঠা "বাশ (1)" এর সাথে
পরামর্শও করিনি

1
@ চবিতে যতদূর আমি বলতে পারি এটি কিছুই করে না, আমি বলতে চাইছিলাম|&
জেসেন

3

@ ডগবেন, ধন্যবাদ
আমি আরও একটি উপায় পেয়েছি যা উভয় প্রবাহকে প্রায় অর্ডারে সংরক্ষণ করে কারণ তারা পুনঃনির্দেশ ছাড়াই মুদ্রণ করতে পারে।

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

তবে এটি কেবল শেলগুলির সাথে কাজ করে যা প্রক্রিয়া প্রতিস্থাপন সমর্থন করে।


-2

এটা চেষ্টা কর :

command 2>&1 | tee bothLog

4
হ্যালো ভ্যাসাইল, এটি প্রশ্নের উত্তর দেয় না: বালকি স্টাডআউট এবং স্টডারারের জন্য পৃথক ফাইলের প্রয়োজন, আপনার সমাধান দুটি একই প্রবাহে মিশে যাবে mix
মাদুর

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