পাইপ ব্যবহার করে কেন গ্রেপ এখানে কাজ করে না?


18

আমার নিম্নলিখিত আদেশ আছে:

find / -name libGL.so.1

যা "অনুমতি অস্বীকৃত" দিয়ে প্রচুর লাইন ফেরত দেয়। আমি এই ধরণের লাইনগুলি বাদ দিতে চাই, তাই আমি নিম্নলিখিতগুলি যুক্ত করেছি:

find / -name libGL.so.1 | grep -v 'denied'

তবে আউটপুট একই - আমার grep -v 'denied'সাথে লাইনগুলি ফিল্টার করা হচ্ছে না Permission denied। আমি অনেক প্রকরণ চেষ্টা করেছি, গ্রেপ টিউটোরিয়াল দেখেছি, তবে আমি সমস্যাটি বুঝতে পারি না। কোনও পরামর্শ?

উত্তর:


43

এর সাথে কিছুই করার নেই grep- এটি কারণ হ'ল বার্তাগুলি স্ট্যান্ডার্ড ত্রুটির প্রবাহে থাকা পাইপটি |স্ট্যান্ডার্ড আউটপুট স্ট্রিমটিকে পুনঃনির্দেশ করে । আপনি ফলাফলের আপনি ব্যবহার স্ট্রিম মিশ্রন দ্বারা চান অর্জন করতে পারে (প্রবাহ যার ফাইল বর্ণনাকারী পুনর্নির্দেশ প্রবাহ যার ফাইল বর্ণনাকারী হয় তাই) যে ভাল হিসাবে হিসাবে grep কমান্ড প্রয়োগ ইনপুট জন্য বাঁশি বাজালাম পরারstdoutPermission deniedstderr2>&121stderrstdout

find / -name libGL.so.1 2>&1 | grep -v 'denied'

তবে এটিকে stderrপুনর্নির্দেশের মাধ্যমে কেবল পুরোপুরি ফেলে দেওয়া আরও স্বাভাবিক হবে/dev/null

find / -name libGL.so.1 2>/dev/null

2> & 1 | এর পরিবর্তে | এবং ব্যবহার করে

আপনি যদি ব্যাশ ম্যান পৃষ্ঠাটি একবার দেখে থাকেন তবে আপনি সম্ভবত এই ব্লার্বটি লক্ষ্য করবেন:

যদি |&ব্যবহার করা হয় তবে কমান্ডের স্ট্যান্ডার্ড ত্রুটি পাইপটির মাধ্যমে কমান্ড 2 এর স্ট্যান্ডার্ড ইনপুটটির সাথে সংযুক্ত থাকে; এটির জন্য সাধারণভাবে সংক্ষেপে হয় 2>&1 |

আপনি STDERR এবং STDOUT এ যোগ দিতে চাইলে আপনি এই নির্মাণটিও ব্যবহার করতে পারেন:

find / -name libGL.so.1 |& grep -v 'denied'

3
কিছু উদ্ভট কারণ ফাইল এ বিদ্যমান যদি তাদের মিশ্রন অতিরিক্ত নোট /foo/bar/denied/libGL.so.1, মিশ্রন stdoutএবং stderr তারপর ফলাফলের লুকাতে হবে ফিল্টারিং
Izkata

5

আপনার আদেশ হতে হবে:

find / -name libGL.so.1 2>/dev/null

অনুসন্ধান স্ট্যান্ডার্ড ত্রুটি (fd2) এর অনুমতি সম্পর্কে অভিযোগ করছে। এই লাইনগুলি অপসারণ করতে, (>) স্ট্যান্ডার্ডটিকে বিট বালতিতে (/ dev / নাল) পুনঃনির্দেশ করুন।


4

"অনুমতি অস্বীকৃত" লাইনগুলি স্ট্যাডার (স্ট্যান্ডার্ড ত্রুটি) প্রবাহে চলেছে, তবে আপনি গ্রেপের মাধ্যমে স্টাডাউট (স্ট্যান্ডার্ড আউট) পাইপ করছেন।

আপনি স্ট্যাডারকে পুরোপুরি পুনর্নির্দেশ করতে পারেন

find / -name libGL.so.1 2> /dev/null

2

আপনি কি কমান্ডটি sudo দিয়ে কল করার চেষ্টা করেছেন ?

sudo find / -name libGL.so.1

এটি যদি বার্তাটি এখনও দেখায় তবে নির্দ্বানে (/ ডিভ / নাল) স্টারারের ইতিমধ্যে উল্লিখিত পুনঃনির্দেশ (fd = 2) ব্যবহার করুন :

sudo find / -name libGL.so.1 2> /dev/null

এখানে আরও ধারণা , শুভ কামনা!

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