यहाँ पाइप काम का उपयोग क्यों नहीं करता है?


18

मेरे पास निम्न कमांड है:

find / -name libGL.so.1

जो "अनुमति अस्वीकृत" के साथ बहुत सारी लाइनें लौटाता है। मैं इस तरह की लाइनों को बाहर करना चाहता हूं, इसलिए मैंने निम्नलिखित जोड़ा:

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

लेकिन आउटपुट एक ही है - मेरे grep -v 'denied'साथ लाइनों को फ़िल्टर नहीं किया जा रहा है Permission denied। मैंने कई बदलावों की कोशिश की है, grep ट्यूटोरियल्स को देखा है, लेकिन मैं समस्या का पता नहीं लगा सकता। कोई सुझाव?

जवाबों:


44

इसका कोई लेना-देना नहीं है grep- यह इसलिए है क्योंकि पाइप |मानक आउटपुट स्ट्रीम को रीडायरेक्ट करता है stdoutजबकि Permission deniedसंदेश मानक त्रुटि स्ट्रीम में होते हैं stderr। आप परिणाम आप उपयोग कर धाराओं के संयोजन के द्वारा चाहते हैं प्राप्त कर सकते थे 2>&1(धारा जिसका फ़ाइल की जानकारी देता है अनुप्रेषित 2धारा जिसका फ़ाइल की जानकारी देता है के लिए 1तो) कि stderrसाथ ही के रूप में stdoutग्रेप आदेश के इनपुट को पहुंचाया जाता है

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 फिर फ़िल्टर करने से परिणाम छिपा होगा
इज़्काता

5

आपकी आज्ञा होनी चाहिए:

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

ढूँढें मानक त्रुटि (fd2) पर अनुमतियों के बारे में शिकायत कर रहा है। उन पंक्तियों को खत्म करने के लिए, बिट बाल्टी (/ देव / नल) के लिए रीडायरेक्ट (>) मानक बाहर।


4

"अनुमति से वंचित" लाइनें stderr (मानक त्रुटि) स्ट्रीम पर जा रही हैं, लेकिन आप grep के माध्यम से stdout (मानक आउट) को पाइप कर रहे हैं।

आप stderr को पूरी तरह से पुनर्निर्देशित कर सकते हैं

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

2

क्या आपने सुडो के साथ कमांड को कॉल करने की कोशिश की है ?

sudo find / -name libGL.so.1

यदि यह अभी भी संदेश दिखाता है, तो पहले से ही बताए गए स्ट्रीडर (fd = 2) का उपयोग निर्वाण (/ देव / अशक्त) के लिए करें :

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

यहाँ अधिक विचार , शुभकामनाएँ!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.