Stdout পাইপ না করে stderr পাইপ কিভাবে


24

স্ট্যান্ডার্ড আউট স্ট্রিমটি পাইপ না করে আমি কীভাবে স্ট্যান্ডার্ড ত্রুটি প্রবাহটি পাইপ করব?

আমি জানি যে এই কমান্ডটি কাজ করে, তবে এটি মানকও লিখে দেয়।

Command 2>&1 | tee -a $LOG

আমি কীভাবে কেবল আদর্শ ত্রুটি পেতে পারি?

দ্রষ্টব্য: আমি এর থেকে যা চাই তা হ'ল একটি স্ট্রডার স্ট্রিমটি কেবল একটি লগতে লিখুন এবং কনসোলটিতে stderr এবং stdout উভয়ই লিখুন।

উত্তর:


26

এটি করতে, stderr এবং stdout স্যুইচ করতে একটি অতিরিক্ত ফাইল বর্ণনাকারী ব্যবহার করুন:

find /var/log 3>&1 1>&2 2>&3 | tee foo.file

মূলত, এটি কাজ করে, বা কমপক্ষে আমার মনে হয় এটি কাজ করে, নীচে:
পুনঃনির্দেশগুলি বাম থেকে ডানে মূল্যায়ন করা হয়।

3>&1 একটি নতুন ফাইল বর্ণনাকারী তৈরি করে, 3 এফডি 1 এর একটি সদৃশ (অনুলিপি)

1>&2 স্টাডাউট (1) এফডি 2 এর একটি নকল তৈরি করুন (স্টডার)

2>&3 এফডি 2 তৈরি করুন, 3 এর একটি সদৃশ (অনুলিপি), যা আগে স্টডআউটের একটি অনুলিপি তৈরি হয়েছিল।

সুতরাং এখন stderr এবং stdout পরিবর্তন করা হয়।

| tee foo.file টি নকল ফাইল বর্ণনাকারী 1 যা stderr মধ্যে তৈরি হয়েছিল।


ওহ, কেএসএস দিয়ে পরীক্ষা করা হচ্ছে না, যদিও বাশের সাথে কাজ করে ...
কাইল ব্র্যান্ড্ট

ধন্যবাদ, ksh এও কাজ করে। আমি মনে করি পাইপ এবং স্ট্রিমের বেশিরভাগ জিনিসই পোস্টিক্স স্ট্যান্ডার্ড।
সি রস

"অনুলিপি" সত্যই সঠিক নয় - দেখুন @ গুয়াসেকোয়ের উত্তর।
কাইল ব্র্যান্ড্ট

এটি tee.exeইনস্টলড উইন্ডোজেও কাজ করে :)
এ্যাকোন

13

কাইলের ইউনিক্স / লিনাক্স কমান্ডটি STDOUT দিয়ে STDERR স্যুইচ করার কাজ করে; তবে ব্যাখ্যাটি মোটেই সঠিক নয়। পুনর্নির্দেশকারী অপারেটররা কোনও অনুলিপি বা সদৃশ করে না, তারা কেবল প্রবাহকে একটি অন্য দিকে পরিচালিত করে।

3> & 1 টি অস্থায়ীভাবে শেষের দিকে সরানোর মাধ্যমে কাইলের কমান্ডটি পুনরায় লেখালেখি করা ধারণাটি সহজ করে তুলবে:

find /var/log  1>&2  2>&3  3>&1  

যদিও এইভাবে লিখিত হয়েছে, লিনাক্স একটি ত্রুটি প্রদর্শন করবে কারণ 3> & 1 এর আগে অবস্থিত হিসাবে & 3 উপস্থিত নেই। 3> কোনও কিছু হ'ল এটি নির্ধারণ করার (সংজ্ঞায়িত করার) উপায় যা আমরা তৃতীয় পাইপ ব্যবহার করতে যাচ্ছি, সুতরাং পাইপটিতে জল প্রবাহিত করার আগে এটি অবস্থিত থাকতে হবে, উদাহরণস্বরূপ কাইল যেভাবে লিখেছিলেন। মজা করার জন্য এই অন্য উপায়ে চেষ্টা করুন:

((echo "STD1";  anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR

অনুলিপি করার উপায় না থাকা লজ্জার বিষয়। আপনি একই কমান্ডে "3> & 1 3> & 2" এর মতো জিনিসগুলি করতে পারবেন না, কারণ লিনাক্স কেবল প্রথম পাওয়া প্রথমটি ব্যবহার করবে এবং দ্বিতীয়টি খারিজ করবে।

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

((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1

নোট করুন যে আমাকে দুবার লগ 1 ব্যবহার করতে হবে এবং উভয় ক্ষেত্রেই আমাকে যুক্ত করতে হবে, প্রথমটি "টি" কমান্ডের জন্য "-a" বিকল্প ব্যবহার করে এবং দ্বিতীয়টি ">>" ব্যবহার করে ব্যবহার করতে হবে।

একটি বিড়াল লগ 1 করছেন আপনি নিম্নলিখিত পেতে:

STD1
STD2
-bash: sdfr: command not found

লক্ষ্য করুন যে ত্রুটিটি দ্বিতীয় লাইনে যেমনটি হওয়া উচিত তেমনটি প্রদর্শন করে না।


অসাধারণ সংশোধন!
কাইল ব্র্যান্ড্ট

একাধিকবার এফডি পুনঃনির্দেশ করতে সক্ষম হতে zsh এবং mult_iosবিকল্পটি (ডিফল্টরূপে) দেখুন।
টম হ্যালে

2

ম্যান পেজ অনুসারে ksh (pdksh) এর জন্য, আপনি ঠিক করতে পারেন:

কমান্ড 2> & 1> / দেব / নাল | বিড়াল -n

অর্থাত্ ডুপ স্টডারকে স্টডআউটে, স্টডআউটকে / ডিভ / নালকে পুনঃনির্দেশ করুন, তারপরে পাইপটিকে 'বিট-এন' এ দিন

আমার সিস্টেমে pdksh এ কাজ করে:

r ভুল () {প্রতিধ্বনি "$ @"> & 2; cho

r ভুল কাজ
foo বিন্যাস

r এরোরোচো foo> / dev / নাল # স্ট্যাডআউট পুনঃনির্দেশিত সহ এখনও প্রদর্শিত হবে
foo বিন্যাস

r এরোরোরচো ফু 2> & 1> / দেব / নাল | বিড়াল -n
     1 ফু
$   

ব্যাসিবক্সের সাথেও কাজ করে
ইউডো জি

1

আপনার এটির মতো চলতে পেয়েছি কারণ আমারও এটির প্রয়োজন ছিল এবং আপনার আদেশটি পরিমার্জন করা হয়েছিল। এখন আমার জন্য এটি ডেবিয়ান স্কিজে এটি ব্যবহার করে ব্যাশ ৩.২ ব্যবহার করে সঠিকভাবে কাজ করে

(echo "foo" 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1 >> log2

যদিও লগ 1 লগইন করে stdout এবং stderr এবং log2 কেবল লগ করে stderr এবং অন্য কিছু এটি স্ক্রিনে রাখে না।

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