আমি কীভাবে স্টার্ডার পাইপ করতে পারি, এবং স্টাডাউট না?


981

আমি একটি প্রোগ্রাম যা কিছু তথ্য লিখে আছে stdoutএবং stderr, এবং আমি প্রয়োজন grepমাধ্যমে কি আসছে দ্বারা stderr , যখন disregarding stdout- এ

আমি অবশ্যই এটি 2 পদক্ষেপে করতে পারি:

command > /dev/null 2> temp.file
grep 'something' temp.file

তবে আমি টেম্প ফাইল ছাড়াই এটি করতে সক্ষম হতে চাই। কোন স্মার্ট পাইপিং কৌশল আছে?


একটি অনুরূপ প্রশ্ন, কিন্তু স্টাডাউট
জোয়েটউইডল

এই প্রশ্নটি বাশের জন্য ছিল তবে বর্ন / অ্যালকুইস্ট শেলের জন্য এটি সম্পর্কিত নিবন্ধটি উল্লেখ করার মতো ।
স্টিফেন নিডজিয়েলস্কি

10
আমি ভালো কিছু আশা করা হয়েছিল: command 2| othercommand। বাশ এতটাই নিখুঁত যে 1982 সালে উন্নয়ন শেষ হয়েছিল, সুতরাং আমরা কখনই তা দেখতে পাব না, আমি ভয় করি afraid
রল্ফ

উত্তর:


1188

প্রথম স্ট্যাডারকে স্টডআউটে পুনর্নির্দেশ করুন - পাইপ; তারপরে স্টাডআউটকে পুনঃনির্দেশ করুন /dev/null(স্ট্যাডার যেখানে যাচ্ছে সেখানে পরিবর্তন না করে):

command 2>&1 >/dev/null | grep 'something'

এর বিভিন্ন ক্ষেত্রে I / O পুনঃনির্দেশের বিশদগুলির জন্য, বাশ রেফারেন্স ম্যানুয়ালটিতে পুনঃনির্দেশগুলি সংক্রান্ত অধ্যায়টি দেখুন ।

নোট করুন যে I / O পুনঃনির্দেশগুলির ক্রমটি বাম-থেকে-ডানকে ব্যাখ্যা করা হয়েছে, তবে I / O পুনর্নির্দেশগুলি ব্যাখ্যা করার আগে পাইপগুলি সেট আপ করা হয়। 1 এবং 2 এর মতো ফাইল বর্ণনাকারী ফাইল বিবরণ খোলার জন্য উল্লেখ। ক্রিয়াকলাপটি 2>&1ফাইল বর্ণনাকারী 2 ওরফে স্টেডারকে ফাইলের বর্ণনা হিসাবে একই ওপেন ফাইলের বিবরণ হিসাবে উল্লেখ করে 1 আরএফ স্টডআউট বর্তমানে (দেখুন dup2()এবং open()) উল্লেখ করছে । অপারেশনটি >/dev/nullপরে ফাইল বর্ণনাকারী 1 পরিবর্তন করে যাতে এটির জন্য একটি ওপেন ফাইলের বিবরণ উল্লেখ করা হয় /dev/null, তবে এটি যে ফাইল বর্ননকারী 2 বোঝায় যে ওপেন ফাইল বিবরণকে বোঝায় যে ফাইল বর্ণনাকারী 1 মূলত ফাইলটি নির্দেশ করছিল - যথা পাইপ।


44
আমি কেবলমাত্র অন্য দিন / দেব / স্টডআউট / দেব / স্টেডার / দেব / স্টিডিনকে হোঁচট খেয়েছি, এবং আমি আগ্রহী ছিলাম যদি সেগুলি একই জিনিস করার ভাল উপায় হয়? আমি সবসময় ভেবেছিলাম 2> এবং 1 কিছুটা উদ্বিগ্ন। সুতরাং এর মতো কিছু: command 2> /dev/stdout 1> /dev/null | grep 'something'
মাইক লিয়নস

17
আপনি /dev/stdoutইত্যাদি ব্যবহার করতে পারেন , বা ব্যবহার করতে পারেন /dev/fd/N। শেলটি যদি বিশেষ ক্ষেত্রে হিসাবে বিবেচনা না করে তবে এগুলি অপেক্ষাকৃত কম দক্ষ হবে; খাঁটি সংখ্যাগত স্বরলিপি নাম দ্বারা ফাইল অ্যাক্সেস জড়িত না, কিন্তু ডিভাইসগুলি ব্যবহার করার অর্থ কোনও ফাইলের নাম অনুসন্ধান। আপনি এটি বিতর্কযোগ্য পরিমাপ করতে পারেন কিনা। আমি সংখ্যার স্বরলিপিটির সংক্ষিপ্ততা পছন্দ করি - তবে আমি এটি এত দিন ধরে ব্যবহার করছি (এক চতুর্থাংশেরও বেশি সময় ধরে!) যে আমি আধুনিক বিশ্বে এর গুণাবলী বিচার করার যোগ্য নই।
জোনাথন লেফলার

23
@ জোনাথন লেফলার: আমি আপনার সরল পাঠ্য ব্যাখ্যার সাথে 'স্ট্ডারকে স্টাডাউটকে পুনঃনির্দেশ করুন এবং তারপরে স্ট্রাউট / ডিভ / নাল'-এর সাথে একটি সামান্য বিষয় নিয়েছি - যেহেতু ডান থেকে বামে (বাম থেকে ডানে নয়) পুনঃনির্দেশ শৃঙ্খলা পড়তে হয়, তাই আমরা আমাদের সরল পাঠ্য ব্যাখ্যাটিও এর সাথে মানিয়ে নেওয়া উচিত: 'স্টডআউটটিকে / dev / নাল থেকে পুনঃনির্দেশ করুন এবং তারপরে স্ট্যাডার যেখানে স্টাডআউট ব্যবহৃত হত'
কর্ট ফেফেল

116
পছন্দ করুন একজনকে অবশ্যই বাঁ দিক থেকে ডানদিকে পুনঃনির্দেশ চেইনগুলি পড়তে হবে কারণ শেলটি সেভাবে প্রক্রিয়া করে। প্রথম অপারেশনটি হ'ল 2>&1, যার অর্থ 'স্ট্যান্ডআউট বর্তমানে যাচ্ছেন ফাইল বর্ণনাকারীর সাথে স্ট্যান্ডার সংযুক্ত করুন '। দ্বিতীয় অপারেশনটি হ'ল স্ট্যান্ডআউট পরিবর্তন করুন এটি চলে যায় /dev/null', স্টার্ডারকে মূল স্টাডাউট, পাইপে রেখে। শেলটি প্রথমে পাইপের প্রতীকগুলিতে জিনিসগুলিকে বিভক্ত করে, সুতরাং, পাইপ পুনর্নির্দেশটি পুনর্নির্দেশের আগে 2>&1বা >/dev/nullপুনঃনির্দেশগুলির আগে ঘটে তবে কেবল এটিই ; অন্যান্য ক্রিয়াকলাপগুলি বাম থেকে ডানদিকে। (ডান-থেকে-বাম কাজ করবে না))
জোনাথন লেফলার

14
আমাকে যে বিষয়টি সত্যই অবাক করে তা হ'ল এটি উইন্ডোজেও কাজ করে ( /dev/nullউইন্ডোজ সমতুল্য নামকরণের পরে , nul)।
মাইকেল বুড়

364

অথবা স্ট্যান্ডার্ড ত্রুটি এবং স্ট্যান্ডার্ড আউটপুট থেকে আউটপুট অদলবদল করতে, ব্যবহার করুন:

command 3>&1 1>&2 2>&3

এটি একটি নতুন ফাইল বর্ণনাকারী (3) তৈরি করে এবং এটিকে 1 (স্ট্যান্ডার্ড আউটপুট) হিসাবে একই জায়গায় নির্ধারণ করে, তারপরে fd 1 (স্ট্যান্ডার্ড আউটপুট) একই জায়গায় fd 2 (স্ট্যান্ডার্ড ত্রুটি) নির্ধারণ করে এবং শেষ পর্যন্ত fd 2 (স্ট্যান্ডার্ড ত্রুটি) বরাদ্দ করে ) এফডি 3 (স্ট্যান্ডার্ড আউটপুট) হিসাবে একই জায়গায়।

স্ট্যান্ডার্ড ত্রুটি এখন স্ট্যান্ডার্ড আউটপুট হিসাবে উপলব্ধ এবং পুরানো স্ট্যান্ডার্ড আউটপুট স্ট্যান্ডার্ড ত্রুটিতে সংরক্ষিত। এটি ওভারকিল হতে পারে তবে এটি আশাবাদী ফাইল ফাইল বর্ণনাকারীদের উপর আরও বিশদ দেয় (প্রতিটি প্রক্রিয়াটিতে নয়টি উপলব্ধ রয়েছে)।


100
একটি চূড়ান্ত ঝাঁকুনি 3>&-আপনি স্টাডাউট থেকে তৈরি করা অতিরিক্ত বর্ণনাকারী বন্ধ করে দেওয়া হবে
জোনাথন লেফলার

1
আমরা একটি ফাইল বর্ণনাকারী আছে তৈরি করা যাবে stderrএবং অন্য সমন্বয় আছে যা stderrএবং stdout? অন্য কথায় stderrএকবারে দুটি ভিন্ন ফাইল যেতে পারেন?
স্টুয়ার্ট

নিম্নলিখিত এখনও stdout ত্রুটি মুদ্রণ। আমি কী মিস করছি? ls -l not_a_file 3> & 1 1> & 2 2> & 3> त्रुटी.txt
ব্যবহারকারী 48956

1
@ জোনাসডাহলবাক: টুইটটি মূলত স্বাচ্ছন্দ্যের একটি বিষয়। সত্যই তীব্রতর পরিস্থিতিতে, এটি ইওএফ সনাক্তকরণ এবং সনাক্ত না করার প্রক্রিয়াটির মধ্যে পার্থক্য তৈরি করতে পারে তবে এটির জন্য খুব অদ্ভূত পরিস্থিতিতে প্রয়োজন।
জোনাথন লেফলার

1
সাবধানতা : ধরে নেওয়া হয়েছে যে এফডি 3 ইতিমধ্যে ব্যবহারে নেই, এটি বন্ধ করে না, এবং 1 এবং 2 ফাইল বর্ণনাকারীদের অদলবদলটিকে পূর্বাবস্থায় ফিরিয়ে আনবে না, সুতরাং আপনি এটি আর একটি কমান্ডে পাইপ করতে পারবেন না। আরও বিশদ এবং কাজের আশেপাশের জন্য এই উত্তরটি দেখুন । {Ba, z} sh এর জন্য অনেক ক্লিনার সিনট্যাক্সের জন্য, এই উত্তরটি দেখুন
টম হেল

218

বাশ-এ, আপনি প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে একটি সাব-শেলের দিকেও পুনর্নির্দেশ করতে পারেন :

command > >(stdlog pipe)  2> >(stderr pipe)

হাতের মামলার জন্য:

command 2> >(grep 'something') >/dev/null

1
স্ক্রিনে আউটপুট দেওয়ার জন্য খুব ভাল কাজ করে। আমি যদি কোনও ফাইলের মধ্যে গ্রেপ আউটপুট পুনঃনির্দেশিত করি তবে কেন গ্রেট না হওয়া সামগ্রীটি আবার উপস্থিত হবে সে সম্পর্কে আপনার কি ধারণা আছে? পরে command 2> >(grep 'something' > grep.log)grep.log থেকে ungrepped.log হিসাবে একই একই আউটপুট রয়েছেcommand 2> ungrepped.log
টিম

9
ব্যবহার 2> >(stderr pipe >&2)। অন্যথায় "স্ট্ডার পাইপ" এর আউটপুট "stdlog পাইপ" এর মধ্য দিয়ে যাবে।
সিলিং

হ্যাঁ, 2> >(...)কাজ করে, আমি চেষ্টা করেছিলাম 2>&1 > >(...)কিন্তু তা হয়নি
datdinhquoc

এখানে একটি ছোট উদাহরণ রয়েছে যা পরের বার আমাকে কীভাবে এটি করতে হবে তা সন্ধান করতে সহায়তা করতে পারে। নিম্নলিখিতগুলি বিবেচনা করুন ... awk -f /new_lines.awk <in-content.txt > out-content.txt 2> >(tee new_lines.log 1>&2 ) এই উদাহরণে আমি এটি দেখতেও চেয়েছিলাম যে আমার কনসোলে ত্রুটি হিসাবে কী প্রকাশ পাচ্ছে। কিন্তু STDOUT আউটপুট ফাইল যাচ্ছে। সুতরাং সাব-শেলটির ভিতরে, আপনাকে এই STDOUT পুনর্নির্দেশ করা দরকার বন্ধনীগুলির মধ্যে ফিরে STDERR এ। যখন এটি কাজ করে, teeকমান্ডটি থেকে STDOUT আউটপুটটি out-content.txtফাইলের শেষে উইন্ডস আপ হয় । এটা আমার কাছে অসঙ্গত বলে মনে হচ্ছে।
হবে

@ দ্যাটদিনহোকোক আমি এটি একরকম করে করেছি2>&1 1> >(dest pipe)
আলিরেজা মোহামাদি

195

এই উত্তরগুলির সাথে সর্বোত্তম সংমিশ্রণ, যদি আপনি করেন:

command 2> >(grep -v something 1>&2)

... তারপরে সমস্ত স্টডআউট স্টডআউট হিসাবে সংরক্ষণ করা হবে এবং সমস্ত স্ট্ডার স্ট্যাডার হিসাবে সংরক্ষণ করা হবে, তবে স্টার্ডারের কোনও লাইন আপনি "কিছু" স্ট্রিং সহ দেখতে পাবেন না।

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


command 2> >(grep -v something)(ছাড়া 1>&2) কি এক নয় ?
ফ্রান্সেস্ক রোসাস

11
না, এটি ছাড়াই, ফিল্টার্ড স্টার্ডারটি স্টডআউটে পৌঁছে যায়।
পিঙ্কো

1
এটিই আমার প্রয়োজন ছিল - ডাইরেক্ট আউটপুট "ফাইলটি পড়ার সাথে সাথে পরিবর্তিত হয়" ডিরেক্টরিতে সবসময়, সুতরাং কেবলমাত্র সেই একটি লাইন ফিল্টার করতে চাই তবে দেখুন যে অন্য কোনও ত্রুটি ঘটেছে কিনা। তাই tar cfz my.tar.gz mydirectory/ 2> >(grep -v 'changed as we read it' 1>&2)কাজ করা উচিত।
23:10 এ

"স্ট্রিং দিয়ে শুরু করা" বলা ভুল। গ্রেপের উপস্থাপিত বাক্য গঠন সম্পর্কে কিছুই নেই যা এটিকে কেবল প্রদত্ত স্ট্রিংয়ের সাথে শুরু হওয়া লাইনগুলি বাদ দেয়। লাইনগুলি যদি তাদের যে কোনও জায়গায় থাকে তবে তা বাদ দেওয়া হবে।
মাইক নকিস

@ মাইকনাকিস ধন্যবাদ - স্থির! (এটি আমার আসল উত্তরের খসড়া থেকে বাকী ছিল, এতে এটি বোধগম্য হয়েছিল ...)
পিংকো

102

"রিডাইরেক্টস" এবং "পাইপ" দিয়ে আসলে কী চলছে সে সম্পর্কে যদি আপনি চিন্তা করেন তবে বিষয়গুলিকে কল্পনা করা অনেক সহজ। বাশে পুনর্নির্দেশগুলি এবং পাইপগুলি একটি কাজ করে: প্রক্রিয়া ফাইলের বর্ণনাকারী 0, 1 এবং 2 পয়েন্ট যেখানে (দেখুন / প্রোক / [পিআইডি] / এফডি / *) দেখুন সেখানে পরিবর্তন করুন।

যখন পাইপ বা "|" কমান্ড লাইনে অপারেটর উপস্থিত থাকে, প্রথমটি হ'ল বাশ একটি ফিফো তৈরি করে এবং বাম দিকের কমান্ডের এফডি 1টিকে এই ফিফোর দিকে নির্দেশ করে এবং ডান পাশের কমান্ডের এফডি 0টিকে একই ফিফোর দিকে নির্দেশ করে।

এরপরে, প্রতিটি পক্ষের পুনঃনির্দেশ অপারেটরগুলি বাম থেকে ডানে মূল্যায়ন করা হয় এবং যখনই বিবরণীর ডুপ্লিকেশন ঘটে তখন বর্তমান সেটিংস ব্যবহার করা হয়। এটি গুরুত্বপূর্ণ কারণ যেহেতু পাইপটি প্রথমে স্থাপন করা হয়েছিল, এফডি 1 (বাম দিক) এবং এফডি0 (ডান দিকের) ইতিমধ্যে তারা সাধারণত যা ছিল তার থেকে পরিবর্তিত হয়েছে এবং এর কোনও সদৃশই সেই সত্যটি প্রতিফলিত করবে।

অতএব, যখন আপনি নীচের মতো কিছু টাইপ করুন:

command 2>&1 >/dev/null | grep 'something'

ক্রমানুসারে যা ঘটে তা এখানে:

  1. একটি পাইপ (ফিফো) তৈরি করা হয়। "কমান্ড এফডি 1" এই পাইপের দিকে নির্দেশিত। "গ্রেপ এফডি0" এছাড়াও এই পাইপের দিকে নির্দেশিত
  2. "কমান্ড এফডি 2" এখানে নির্দেশিত যেখানে "কমান্ড এফডি 1" বর্তমানে নির্দেশিত (পাইপ)
  3. "কমান্ড এফডি 1" / dev / নাল দ্বারা নির্দেশিত

সুতরাং, "কমান্ড" তার FD 2 (stderr) এ যে সমস্ত আউটপুট লিখেছেন তা পাইপের দিকে এগিয়ে যায় এবং অন্যদিকে "গ্রেপ" দ্বারা পড়ে is "কমান্ড" তার FD 1 (stdout) এ যে সমস্ত আউটপুট লিখেছে সেগুলি তার / dev / নাল পর্যন্ত চলে।

পরিবর্তে, আপনি নিম্নলিখিত চালান:

command >/dev/null 2>&1 | grep 'something'

যা ঘটে তা এখানে:

  1. একটি পাইপ তৈরি হয় এবং "কমান্ড এফডি 1" এবং "গ্রেপ এফডি 0" এটিতে নির্দেশিত হয়
  2. "কমান্ড এফডি 1" / dev / নাল দ্বারা নির্দেশিত
  3. "FD 2 কমান্ড" নির্দেশিত যেখানে এফডি 1 বর্তমানে পয়েন্ট করে (/ dev / নাল)

সুতরাং, "কমান্ড" থেকে সমস্ত stdout এবং stderr / dev / null এ যান। পাইপে কিছুই যায় না, এবং এইভাবে স্ক্রিনে কিছু না দেখিয়ে "গ্রেপ" বন্ধ হয়ে যায়।

এছাড়াও নোট করুন যে পুনঃনির্দেশগুলি (ফাইল বর্ণনাকারী) কেবল পঠনযোগ্য (<), কেবল লেখার জন্য (>), বা পঠন-লিখন (<>) হতে পারে।

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


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

3
@ মার্কেডিংটন দয়া করে নোট করুন যে পাইপ এবং আইপিসির প্রসঙ্গে নামক পাইপের জন্য ফিফো কেবলমাত্র একটি পদ । আরও সাধারণ প্রসঙ্গে, ফিফোর অর্থ ফার্স্ট ইন, ফার্স্ট আউট, যা সারি ডেটা কাঠামো থেকে সন্নিবেশ এবং অপসারণকে বর্ণনা করে।
লুমচাইল্ড

5
@ লুমচাইল্ড অবশ্যই আমার মন্তব্যের মূল বক্তব্যটি ছিল যে পাকা বিকাশকারী হিসাবেও আমি ফিফোর নামক পাইপের প্রতিশব্দ হিসাবে ব্যবহৃত দেখিনি । অন্য কথায়, আমি এটি জানতাম না: en.wikedia.org/wiki/FIFO_ ( কমপুটিং_এন্ড_ ইলেক্ট্রনিক্স )# পাইপস - উত্তরে যে আমার সময় সাশ্রয় করে তা পরিষ্কার করা।
মার্ক এডিংটন

39

আপনি যদি ব্যাশ ব্যবহার করছেন তবে ব্যবহার করুন:

command >/dev/null |& grep "something"

http://www.gnu.org/software/bash/manual/bashref.html#Pipelines


4
না, |&সমান 2>&1যা স্টডআউট এবং স্টডার যুক্ত করে। প্রশ্নটি স্পষ্টভাবে স্টাডআউট ছাড়াই আউটপুট চেয়েছিল ।
প্রোফ্যাচটছ

3
| '| &' ব্যবহার করা হলে, কমান্ড 1 এর স্ট্যান্ডার্ড ত্রুটি পাইপের মাধ্যমে কমান্ড 2 এর স্ট্যান্ডার্ড ইনপুটটির সাথে সংযুক্ত; এটি 2> & 1 | "এর জন্য সংক্ষিপ্ত আপনার লিঙ্কে চতুর্থ অনুচ্ছেদ থেকে ভারব্যাটিম নেওয়া।
প্রোফ্যাট্যাশ

9
@ প্রফটপাটস: কেনের উত্তরটি সঠিক, দেখুন তিনি স্টাডাউট এবং স্টার্ডারের সংমিশ্রণের আগে নালায় পুনর্নির্দেশ করেছেন, সুতরাং আপনি কেবল স্টাডারকে পাইপে পেয়ে যাবেন, কারণ স্টাডআউটটি আগে / ডিভ / নুলে ফেলে দেওয়া হয়েছিল।
লুসিয়ানো

3
তবে আমি এখনও আপনার উত্তরটি ভুল দেখতে পেয়েছি, এর >/dev/null |&প্রসারিত >/dev/null 2>&1 | এবং এর অর্থ স্টাডাউট ইনোডটি পাইপের জন্য খালি কারণ কোনও (# 1 # 2 উভয়ই / dev / নাল ইনোডের সাথে আবদ্ধ) স্টাডআউট ইনোডের সাথে আবদ্ধ নয় (যেমন ls -R /tmp/* >/dev/null 2>&1 | grep iখালি দেবে, তবে অনুমতি ls -R /tmp/* 2>&1 >/dev/null | grep iদেবে # 2 যা স্টাডাউট ইনোডের সাথে বেঁধে দেওয়া হবে))
ফল 13

3
কেন শার্প, আমি পরীক্ষা করেছি এবং ( echo out; echo err >&2 ) >/dev/null |& grep "."কোনও আউটপুট দেয় না (যেখানে আমরা "এরর" চাই)। man bashবলেছেন যদি & & ব্যবহৃত হয়… 2> & 1 | এর জন্য শর্টহ্যান্ড। মান আউটপুটে মান ত্রুটির এই অন্তর্নিহিত পুনর্নির্দেশ কমান্ড দ্বারা নির্দিষ্ট কোনও পুনর্নির্দেশের পরে সঞ্চালিত হয় is সুতরাং প্রথমে আমরা কমান্ডের এফডি 1 বাতিল করতে পুনঃনির্দেশ করি, তারপরে আমরা কমান্ডের এফডি 2 পুনর্নির্দেশ করি যেখানে এফডি 1 নির্দেশিত, অর্থাৎ। নাল, সুতরাং গ্রেপের FD0 কোনও ইনপুট পায় না। আরও গভীরতর ব্যাখ্যার জন্য stackoverflow.com/a/18342079/69663 দেখুন ।
unhammer

11

যারা stdout এবং stderr কে স্থায়ীভাবে ফাইলে পুনঃনির্দেশ করতে চান, stderr তে গ্রেপ করুন, তবে stdout টিটিটিতে বার্তা লিখতে রাখুন:

# save tty-stdout to fd 3
exec 3>&1
# switch stdout and stderr, grep (-v) stderr for nasty messages and append to files
exec 2> >(grep -v "nasty_msg" >> std.err) >> std.out
# goes to the std.out
echo "my first message" >&1
# goes to the std.err
echo "a error message" >&2
# goes nowhere
echo "this nasty_msg won't appear anywhere" >&2
# goes to the tty
echo "a message on the terminal" >&3

6

এটি কমান্ড 1 স্ট্ডারকে কমান্ড 2 স্ট্ডিনে পুনর্নির্দেশ করবে, কমান্ড 1 স্টাডাউটকে যেমন রেখে যাবে।

exec 3>&1
command1 2>&1 >&3 3>&- | command2 3>&-
exec 3>&-

এলডিপি থেকে নেওয়া


2

আমি সবেমাত্র একটি stdoutকমান্ড এবং stderrঅন্যটিতে নামকরণ পাইপ ব্যবহার করে প্রেরণের সমাধান নিয়ে এসেছি ।

এখানে যায়।

mkfifo stdout-target
mkfifo stderr-target
cat < stdout-target | command-for-stdout &
cat < stderr-target | command-for-stderr &
main-command 1>stdout-target 2>stderr-target

নামকরণ করা পাইপগুলি পরে মুছে ফেলা সম্ভবত একটি ভাল ধারণা।


0

আপনি আরসি শেল ব্যবহার করতে পারেন ।

প্রথমে প্যাকেজটি ইনস্টল করুন (এটি 1 এমবি এরও কম)।

এভাবেই আপনি স্ট্যান্ডার্ড আউটপুট এবং পাইপ মান ত্রুটি বাতিল হবে একটি উদাহরণ , grep মধ্যে rc:

find /proc/ >[1] /dev/null |[2] grep task

আপনি বাশকে না রেখে এটি করতে পারেন:

rc -c 'find /proc/ >[1] /dev/null |[2] grep task'

আপনি লক্ষ্য করেছেন যে, আপনি পাইপের পরে বন্ধনী ব্যবহার করে কোন ফাইল বর্ণনাকারীটি পাইপ করতে চান তা নির্দিষ্ট করতে পারেন।

স্ট্যান্ডার্ড ফাইল বর্ণনাকারীদের এমন হিসাবে অঙ্ক করা হয়:

  • 0: স্ট্যান্ডার্ড ইনপুট
  • 1: স্ট্যান্ডার্ড আউটপুট
  • 2: স্ট্যান্ডার্ড ত্রুটি

-3

আমি অনুসরণ করার চেষ্টা করি, এটি কাজ করে দেখতেও পেয়েছি,

command > /dev/null 2>&1 | grep 'something'

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