2> এবং 1> আউটপুট.লগ এবং 2> এবং 1 | এর মধ্যে পার্থক্য টি আউটপুট.লগ


35

আমি নিম্নলিখিত দুটি কমান্ডের মধ্যে পার্থক্য জানতে চেয়েছিলাম

2>&1 > output.log 

এবং

2>&1 | tee output.log

আমি আমার সহকর্মীদের একজনকে পুনঃনির্দেশ করার জন্য দ্বিতীয় বিকল্পটি ব্যবহার করতে দেখেছি। আমি জানি যে 2> ও 1 কী করে, আমার একটাই প্রশ্ন টি ব্যবহার করার উদ্দেশ্য কী যেখানে একটি সাধারণ পুনঃনির্দেশ ">" অপারেটর ব্যবহার করা যেতে পারে?

উত্তর:


11

দুটি কমান্ড পৃথকভাবে তাকানো:

utility 2>&1 >output.log 

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

এর দৃশ্যমান প্রভাবটি হ'ল আপনি পর্দায় স্ট্যান্ডার্ড ত্রুটিতে যা উত্পাদিত হয়েছে এবং ফাইলে স্ট্যান্ডার্ড আউটপুটে কী উত্পন্ন হবে তা পাবেন।

utility 2>&1 | tee output.log

এখানে, আপনি স্ট্যান্ডার্ড ত্রুটিটিকে স্ট্যান্ডার্ড আউটপুট স্ট্রিমের মতো একই জায়গায় পুনর্নির্দেশ করুন। এর অর্থ হ'ল উভয় স্ট্রিমগুলি teeএকক আন্তঃযুক্ত আউটপুট প্রবাহ হিসাবে ইউটিলিটিতে পাইপ করা হবে এবং এই মানক আউটপুট ডেটা প্রদত্ত ফাইলটিতে সংরক্ষণ করা হবে teeteeকনসোলে ডেটা অতিরিক্তভাবে পুনরুত্পাদন করা হবে (এটি যা teeকরে, এটি ডেটা স্ট্রিমগুলি নকল করে)।

এর মধ্যে কোনটি ব্যবহৃত হয় তা আপনি কী অর্জন করতে চান তার উপর নির্ভর করে।

নোট করুন যে আপনি দ্বিতীয় পাইপলাইনটির প্রভাবটি কেবলমাত্র >(যেমনটি হিসাবে utility >output.log 2>&1ফাইলটিতে স্ট্যান্ডার্ড আউটপুট এবং ত্রুটি উভয়ই সংরক্ষণ করতে পারবেন) দিয়ে পুনরুত্পাদন করতে সক্ষম হবেন না । teeকনসোলের পাশাপাশি আউটপুট ফাইলে ডেটা পেতে আপনাকে ব্যবহার করতে হবে।


অতিরিক্ত নোট:

দৃশ্যমান প্রথম কমান্ডের প্রভাব,

utility 2>&1 >output.log 

হিসাবে একই হবে

utility >output.log

অর্থাৎ, স্ট্যান্ডার্ড আউটপুট ফাইলটিতে যায় এবং মান ত্রুটি কনসোলে যায়।

উপরের প্রতিটি কমান্ডের শেষে যদি আরও প্রসেসিং পদক্ষেপ যুক্ত করা হয় তবে বড় পার্থক্য হবে যদিও:

utility 2>&1 >output.log | more_stuff

utility >output.log      | more_stuff

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


কমান্ড "সাথে utility 2>&1 | tee output.log, আপনি বলতে চাই যে 1 থেকে টী বর্ণের নাম নির্দেশ হচ্ছে, 2 হিসাবে ভাল মানে কী। যেহেতু টী বর্ণের নাম প্রবাহ সদৃশ, আউটপুট উভয় পাশাপাশি কনসোলে প্রদর্শিত হয় হিসাবে ফাইল লেখা? অত: পর মধ্যে পার্থক্য utility 2>&1 > output.logএবং utility 2>&1 | tee output.logহয় teeএটা প্রবাহ সদৃশ যে হায় সঠিক হতে।?
পরিচালিত হয়ে

utility 2>&1 > output.log | more_stuffএবং utility >ouput.logএর উদাহরণ সহ | more_stuff , is the difference that more_stuff` এর একটি ইনপুট হিসাবে কনসোলের স্ট্যান্ডার্ড ত্রুটি আউটপুট আছে more_stuff? যেহেতু দ্বিতীয় উদাহরণে কনসোলে কোনও আউটপুট নেই, মূলত কোনও ইনপুট নেই more_stuff? যদি হ্যাঁ, পূর্ববর্তী অনুচ্ছেদটি থেকে এটি পরিষ্কার নয় আপনি নোট করেছেন যে স্ট্যান্ডার্ড আউটপুট ফাইলটিতে যায় এবং মানক ত্রুটি কনসোলে যায়।
অনুপ্রাণিত

@ প্রচারিত আপনার প্রথম মন্তব্যটি আমার কাছে সঠিক বলে মনে হচ্ছে, হ্যাঁ। দ্বিতীয় মন্তব্য হিসাবে: প্রথম কমান্ডে, এর ত্রুটি প্রবাহে মূলত যা প্রেরণ করা হয়েছিল more_stuffতা পাবেন (তবে যা স্ট্যান্ডার্ড আউটপুটটিতে পুনঃনির্দেশিত হয়েছিল)। এটি না থাকলে এটি কনসোলে শেষ হবে না, তবে এটি স্ট্যান্ডার্ড আউটপুট প্রবাহে চলেছে বলে । দ্বিতীয় কমান্ডে, পায় কিছুই সেখানে পাইপলাইন বাম দিক থেকে কোন মান আউটপুট। ত্রুটি প্রবাহটি এখনও দ্বিতীয় কমান্ডের কনসোলে শেষ হবে। utilitymore_stuffmore_stuffutility
Kusalananda

ধন্যবাদ। আপনি কি বোঝাতে চেয়েছেন যে আদেশটি utility > output.log | more_stuffকোনও ত্রুটি দৃষ্টিকোণ থেকে স্ট্যান্ডার্ড আউটপুট প্রবাহে আউটপুট দেয় না?
অনুপ্রাণিত

@ মোটিভেটেড যেহেতু বাম দিকের স্ট্যান্ডার্ড আউটপুটটিতে কোনও কিছুই উত্পাদন করে না (এটি পুনঃনির্দেশিত), তাই পাইপের উপরে কোনও ডেটা প্রেরণ করা হবে না।
Kusalananda

24

সম্পাদকীয় নোট

অনুগ্রহ করে এই উত্তরটি - ডারোবার্টের মন্তব্যগুলি পড়তে ভুলবেন না


আসল উত্তর

2>&1 >output.logমানে প্রথমে সমস্ত ফাইল হ্যান্ডেল 2 স্টাফ (স্ট্যান্ডার্ড ত্রুটি) ফাইল হ্যান্ডেল 1 (স্ট্যান্ডার্ড আউটপুট) এ প্রেরণ শুরু করুন এবং তারপরে এটি ফাইলটিতে প্রেরণ করুন output.log। অন্য কথায়, লগ ফাইলে স্ট্যান্ডার্ড ত্রুটি এবং স্ট্যান্ডার্ড আউটপুট প্রেরণ করুন।

2>&1 | tee output.log2>&1বিটের সাথে একই , এটি স্ট্যান্ডার্ড আউটপুট প্রবাহের সাথে স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটির সমন্বয় করে। তখনই পাইপ যে মাধ্যমে teeপ্রোগ্রাম যা তার মান আউটপুট (মত তার মান ইনপুট পাঠাব cat) এবং এছাড়াও ফাইলে। সুতরাং এটি দুটি স্ট্রিম (ত্রুটি এবং আউটপুট) একত্রিত করে, তারপরে এটি টার্মিনাল এবং ফাইলের আউটপুট করে।

নীচের লাইনটি প্রথমটি ফাইলকে প্রেরণ করে stderr/ stdoutদ্বিতীয়টি ফাইল এবং স্ট্যান্ডার্ড আউটপুট উভয়কেই প্রেরণ করে (এটি সম্ভবত টার্মিনাল হয় যদি না আপনি অন্য নির্মাণের ভিতরে থাকেন যা স্ট্যান্ডার্ড আউটপুট পুনঃনির্দেশিত করে)।

আমি শেষ সম্ভাবনাটি উল্লেখ করেছি কারণ আপনার মতো উপাদান থাকতে পারে:

(echo hello | tee xyzzy.txt) >plugh.txt

যেখানে টার্মিনালটিতে কিছুই শেষ হয় না।


13
-1 আপনার বাক্য গঠন ঠিক আছে, কিন্তু শব্দার্থবিজ্ঞানের নয়। রান করুন cat /doesnotexist 2>&1 >output.txt- আপনি cat: /doesnotexist: No such file or directoryটার্মিনালে প্রদর্শিত দেখবেন এবং আউটপুট.টিএসটিএসটি খালি ফাইল। অগ্রাধিকারের অর্ডার এবং বন্ধ হওয়ার 2>&1প্লেটি চলছে : ( বর্তমান এফডি 1 থেকে ডুপ এফডি 2), তারপরে >output.txt(অন্য কোনও কিছু পরিবর্তন না করে, এফডি 1 কে আউটপুট.টেক্সটে পুনর্নির্দেশ করুন)। কারণ 2>&1 |ভিন্ন পূর্ববর্তিতার ক্রম কারণ হল: |সামনে >
আর্জেজ

5
এই উত্তরটি মূলত প্রতিটি ক্ষেত্রেই মূলত ভুল । নীচের উত্তরগুলির অনেকগুলি ভাল, তবে আমি মনে করি কুসালানন্দের এই উত্তরটি সবচেয়ে পরিষ্কার।
মাইকেল হোমার

2
@ ইউজার ১৪৪০৮: আপনি যদি ইউনিক্স এবং লিনাক্সে কখনও অ্যাকাউন্ট তৈরি করে এই উত্তরটির দাবি করতে পারেন তবে একবার মন্তব্যে সম্বোধন করার পরে দয়া করে আমার সম্পাদকীয় নোটটি সরাতে দ্বিধা বোধ করবেন না।
ডারোবার্ট

8

প্রথম কমান্ড অন্য কাজটি করবে:

পরে

2>&1 > output.log 

পুরানো STDOUT সংরক্ষণ করা হবে (অনুলিপি করা হয়েছে) STDERR এ এবং তারপরে STDOUT ফাইলের দিকে পুনঃনির্দেশিত হবে।

সুতরাং, stdout ফাইল যেতে হবে এবং stderr কনসোল যাবে।

এবং ভিতরে

 2>&1 | tee output.log

উভয় স্ট্রিম টিতে পুনঃনির্দেশিত হবে। টি কোনও স্ট্যান্ডআউট (আপনার ক্ষেত্রে কনসোল) এবং ফাইল ( output.log) ফাইল করার জন্য কোনও ইনপুট নকল করবে ।

এবং প্রথম অন্য একটি ফর্ম আছে:

    > output.log  2>&1

এটি STDOUT এবং STDERR উভয়ই ফাইলে পুনর্নির্দেশ করবে।


4

প্রাক্তন ফলাফলগুলি কেবলমাত্র ফাইলটিতে। দ্বিতীয়টি ফাইল এবং স্ক্রিনে উভয়ই আউটপুট দেয়।


4

কারণ 2>&1 | teeএকটি লগ ফাইল উভয় stdout- এ এবং দ্বারা stderr ক্যাপচার এবং একই সময়ে পর্দায় এইটিকে দেখতে সক্ষম হতে হয়। এটি >output.txt 2>&1 & tail -fপাশাপাশি করা যেতে পারে তবে আপনি জানতে পারবেন না কখন ব্যাকগ্রাউন্ড কমান্ডটি সমাপ্ত হয় - প্রোগ্রামটি সমাপ্ত হয় বা এটি কোনও আউটপুট ছাড়াই চলছে। 2>&1 | teeপ্রোগ্রামারদের জন্য একটি সাধারণ বাগ্ধারা ছিল।


আপনি কি বলতে চাইছেন যে উদাহরণস্বরূপ 2> & 1> file.txt ফাইল sttout এবং stderr উভয়ই file.txt- তে ক্যাপচার করবে না?
অনুপ্রেরণা

0

প্রথমে কিছু নমুনা কোড দেখুন:

#include <stdio.h>
main() 
{
// message 1, on stdout (using  printf)
printf("%s",          "message 1, on stdout (using  printf)\n");

// message 2, on stdout (using fprintf)
fprintf(stdout, "%s", "message 2, on stdout (using fprintf)\n");

// message 3, on stderr (using fprintf)
fprintf(stderr, "%s", "message 3, on stderr (using fprintf)\n");
}

ফলাফলগুলি তুলনায় আসুন:
./helloerror
+ ফাইল: কোনও বার্তা নেই; কনসোল: বার্তা 1,2,3;

./helloerror >error.txt
+ ফাইল: বার্তা 1,2; কনসোল: বার্তা 3;

./helloerror 2>&1 >error.txt
+ ফাইল: বার্তা 1,2; কনসোল: বার্তা 3;
./helloerror> error.txt এর মতোই

./helloerror >error.txt 2>&1
+ ফাইল: বার্তা 3,1,2; কনসোল: কোনও বার্তা নেই;
অর্ডার 3 টি প্রথমে 1, তারপরে 2 নোট করুন

./helloerror | tee error.txt 2>&1
+ ফাইল: বার্তা 1,2; কনসোল: বার্তা 3,1,2;
অর্ডার 3 টি প্রথমে 1, তারপরে 2 নোট করুন

./helloerror 2>&1 | tee error.txt
+ ফাইল: বার্তা 3,1,2; কনসোল: বার্তা 3,1,2;

ব্যবহারের জন্য:
./helloerror >error.txt 2>&1
-> যদি কেউ ফাইলের সমস্ত (stdout + stderr) বার্তা চায় তবে কনসোলে পিনটে না

./helloerror 2>&1 | tee error.txt
-> যদি কেউ ফাইলের সমস্ত (stdout + stderr) বার্তা চায় এবং কনসোলে মুদ্রিত হয়


-1

এখানে ইউনিক্স আউটপুট স্ট্রিমগুলির সংক্ষিপ্তসার পোস্ট রয়েছে: http://www.devcodenote.com/2015/04/unix-output-streams.html

পোস্ট থেকে একটি স্নিপেট:

এখানে 3 টি স্ট্যান্ডার্ড আউটপুট স্ট্রিম রয়েছে:

STDIN - Standard Input - Writes from an input device to the program
STDOUT - Standard Output - Writes program output to screen unless specified otherwise.
STDERR - Standard Error Output - Writes error messages. Also printed to the screen unless specified otherwise.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.