পুনঃনির্দেশটি কীভাবে ব্যবহার করব তা আমি কীভাবে মনে করতে পারি?


40

আমি জানি কি

  program > /dev/null 2>&1 

আছে। এটি আউটপুটটিকে পুনর্নির্দেশ করে /dev/nullএবং 2>&1আউটপুট যেখানে পাঠানো হয় একই জায়গায় ত্রুটি আউটপুটটিকে পুনর্নির্দেশ করা।

আমার সমস্যাটি হ'ল আমাকে সর্বদা গুগল করতে হয় কারণ আমি কখনই এটি মনে করি না।

সুতরাং, আমি চেষ্টা &2>1, 1>2&, 1>&2... আমি যে সমন্বয় না হওয়া পর্যন্ত আমি এটা google চেষ্টা করুন ...

সহজে মনে রাখার কৌশলটি কী?


আমার একই সমস্যা আছে, তাই আমি এটি "দীর্ঘ" পথটি করি - উভয়কেই পুনর্নির্দেশ করি program 1> /dev/null 2>/dev/null। কিছু সময় যদিও আপনাকে একত্রে মিশ্রিত করতে হবে stdoutএবং stderrসত্যিকার অর্থে কী চলছে তা দেখার জন্য - যেমন একটি জটিল সংকলন প্রক্রিয়া থেকে আউটপুট কোনও ফাইলে পুনঃনির্দেশিত হচ্ছে like
সেক্ষেত্রে

উত্তর:


20

আউটপুট ত্রুটির চেয়ে ভাল তাই এটি প্রথমে আসে (1 বনাম 2)।

>'যাও' জন্য সংক্ষিপ্তরূপে হয়। বাম দিকে যা আমি প্রেরণ করতে চাই এবং ডানদিকে যেখানে আমি এটি প্রেরণ করতে চাই। যেহেতু 'যেখানে' সর্বদা একটি ফাইল থাকে, তেমন কিছু

program > /dev/null 2>1

1 নামক একটি ফাইলে পুনর্নির্দেশ করবে Thus সুতরাং, অ্যাম্পারস্যান্ড (&)ফাইলটিকে বিবরণী ফাইলটিতে পরিবর্তন করে।

দুর্ভাগ্যক্রমে, আমি আমার নিজের স্মৃতিবিজালীর মুখোমুখি হয়ে উঠিনি বা বিকাশ করিনি, তবে যখন আমি প্রথম * নিক্স শিখছিলাম তখন আমি কাজ করার পক্ষে এই যৌক্তিক উপায়টি খুঁজে পেয়েছি। কয়েকটি রান-থ্রো করার পরে এটি দ্বিতীয় প্রকৃতিতে পরিণত হয়।


আপনার প্রথম বাক্যটি আমার কাছে বোঝায় না। stdoutফাইলের বর্ণনা 1, stderr2 হয়। সুতরাং, "আউটপুট" এর আগে "ত্রুটি" আসে।
ওয়ারেন ইয়ং

কোন বাক্য বর্ণনাকারী মনে রাখবেন stdoutএবং stderrউল্লেখ করুন তা এই বাক্যটি স্মরণীয় ।
gvkv

ঠিক আছে, তবে এটি এখনও বিভ্রান্তিকর বলে মনে হচ্ছে, যেহেতু মূল প্রশ্নটি "2> & 1" প্রসারণের অক্ষরগুলির ক্রমটি মনে করার চেষ্টা করার বিষয়ে।
ওয়ারেন ইয়ং

9

একটি কৌশলটি কেবল মনে রাখতে হবে যে 1 = স্ট্যান্ডার্ড আউটপুট, 2 = স্ট্যান্ডার্ড ত্রুটি। তাই:

2>&1= স্ট্যান্ডার্ড ত্রুটি স্ট্রিম স্ট্যান্ডার্ড আউটপুট প্রবাহে যায়।
1>&2= বিপরীত।

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


7

&গিঁট হিসাবে দেখা সাহায্য করতে পারে: আপনি 2 আউটপুট গ্রহণ হিসাবে কি করতে চান তা ভেবে দেখুন 2>, এবং 1 এর সাথে এটি বেঁধে রাখা, তাই2>&1


2
আমি "দুটি আউট এবং একটি" বাক্যটি মুখস্থ করেছি। আপনার স্মৃতিচারণ একটি বাক্যাংশ বা গিঁট, একটি থাকার সত্যিই সাহায্য করবে।
টিম কেনেডি

5

আসলে, আপনি কী শেল ব্যবহার করছেন তা নির্ভর করে। বাশ সাধারণত খুব ক্ষমাশীল এবং আপনি কেবল এটি করতে পারেন:

program &> file

5

আসুন এই তিনটি বিকল্প বিবেচনা করুন:

program  2>1
program  2>1& 
program  2>&1

প্রথম স্ট্যাডারকে একটি ফাইলের নাম "1" এ প্রেরণ করে: সর্বোপরি, বাশ কোনও ফাইলের কাছে পুনর্নির্দেশের প্রত্যাশা করে।

দ্বিতীয়টি একই ফাইলে পুনঃনির্দেশ করে তবে programপটভূমিতে চলে: এটি একটি পিছনের &অর্থ যা বোঝায়।

এটি তৃতীয় সম্ভাবনাটিকে একমাত্র হিসাবে ফেলে দেয় যা কোনও ফাইল হ্যান্ডেলে পুনর্নির্দেশের জন্য ব্যাশ মহাবিশ্বে অর্থবোধ করে।

0, 1, 2 এর মধ্যে কোনটি কীভাবে মনে রাখবেন? কনসোল থেকে কম্পিউটার চালানোর বিষয়ে ভাবুন। প্রথমত, আপনাকে কিছু টাইপ করতে হবে (0 = স্টিডিন)। তারপরে, আপনি আউটপুট দেখতে পাবেন (1 = স্টডআউট)। সবশেষে এবং শুধুমাত্র কিছু ভুল হয়ে গেলে আপনি স্ট্যাডার দেখেন (2)।


1

আপনার ওয়ালপেপার এ আঁকুন।

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


1

ব্যাশ শেলের ক্ষেত্রে আমি মনে রাখার সবচেয়ে ভাল উপায়টি হ'ল যা ঘটছে তা বোঝা।
আপনি যদি যা করতে চান তার মধ্যে যদি আদেশটি সঠিকভাবে পেতে হয় তবে তা আপনি মনে করতে পারেন

program > /results 2> /results

এটি দুর্দান্ত এবং সুস্পষ্ট যা চলছে এবং মনে রাখা সহজ। অর্থাত

  • 1 STDOUT যাচ্ছে /results
  • 2Stderr এছাড়াও যাচ্ছে সরাসরি করতে/results

সমস্যাটি হ'ল এটি যেমনটি আপনি আশা করেন তেমন কাজ করে না। নিম্নোক্ত বিবেচনা কর:

ফাইল: /tmp/poem.txt

the quick brown fox jumped over the lazy dog

এবং রান কমান্ড

grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results

তারপর

$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
 lazy dog

সেখানে কি ঘটেছিল?
আমার বুদ্ধিটি এসটিডিআরআরকে সরাসরি ফাইলে নির্দেশ করে পুনঃনির্দেশটি সেটাকে সেট আপ করা /tmp/resultsএবং প্রকৃতির কারণ >যা 2 টি কাজ করে

  1. সাধারণত একটি নতুন ফাইল তৈরি করুন - এক্ষেত্রে সুযোগটি পাস হওয়ার সাথে সাথে আউটপুট তৈরি হওয়ার সময় বাশ এই রুটিনটি পেরিয়ে গেছে।
  2. সরাসরি ফাইলের শুরুতে sertোকান। এবং যেমন সংযোজন >>না।

সুতরাং এই ক্ষেত্রে এসটিডিআরআর, সরাসরি এসটিডিআউট /tmp/resultsআউটপুটকে ওভাররাইড করার শুরুতে সন্নিবেশ করায় ।
দ্রষ্টব্য: আপনি যদি >>সংযোজন করতেন তবে আপনি সম্ভবত এই বাক্য গঠনটি সরিয়ে ফেলতে পারেন।
তবে আপনার প্রয়োজনীয় সমস্যাটি সমাধান করার জন্য - এসটিডিআরআর - সরাসরি ফাইলে পুনর্নির্দেশ করা নয়, বরং এসটিডিআরআর এর আউটপুটটি STDOUT প্রবাহে একীভূত করার জন্য , যাতে আপনি কোনও সংঘর্ষ না পান।
অপারেটর 2>&1অপারেটর ব্যবহার করে এটি অর্জন করে

grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1

&নামে একটি ফাইল থেকে পার্থক্য ব্যাশ সম্ভব 1এবং 1ফাইল বর্ননাকারী।
আমার কাছে বিবৃতি 2>&1নিজেই ব্যাখ্যা করছে যা ঘটছে - এসটিডিআরআর নিজেই এসটিডিআউটে পুনঃনির্দেশিত হচ্ছে - এবং কেবলমাত্র /tmp/resultsএখানেই শেষ হয় কারণ যেখানে স্টাডুট নির্দেশিত (প্রায় পার্শ্ব প্রতিক্রিয়া হিসাবে) ts অনেকগুলি গাইডের বিপরীতে
, যা এটি 2>&1এসটিডিআরআর প্রেরণ করে যেখানে কখনও স্টাডিআউটকে নির্দেশ করা হয়। যদি এটি সত্য হয় - আপনার তখনও ওভাররাইটিং সমস্যা থাকবে।

আরও তথ্যের জন্য দেখুন - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection

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