लिनक्स कम व्यवहार और stderr


11

मैं अपने जटिल कमांड के आउटपुट को देख रहा हूं less, समस्या stderrखो गई है। stderrआम तौर पर stdoutलाइनों के अंदर सूचीबद्ध inbetween लाइनें मिलती हैं less। मैं चाहूंगा कि उन्हें कंसोल पर मुद्रित किया जाए, और जब मैं बाहर निकलता हूं less, तो उन्हें एक साथ देखने के लिए।

मुझे लगता है कि इस के लिए कोई समाधान नहीं हो सकता है, मैं के बारे में पढ़ा teeऔर multiteeलेकिन कोई किस्मत अब तक।


2
आप मुझे बता रहे हैं कि stdout में stderr को पुनर्निर्देशित कैसे करें, लेकिन ऐसा नहीं है जो मैं चाहता था। मैं stderr को कम अंदर stdout के साथ मिश्रण नहीं करना चाहता। जब मैं कम बाहर निकलता हूं तो मैं टर्मिनल में रहना चाहता हूं।

यदि stderrइसे पुनर्निर्देशित किया जाता है stdout, तो सभी आउटपुट को सामान्य आउटपुट के साथ मिश्रित किया stderr जाएगाstdout । उस आउटपुट को पाइप करना lessदोनों को दिखाएगा।
कुछ प्रोग्रामर

यदि मैं "जब मैं कम बाहर निकलता हूं तो टर्मिनल में रहने के लिए stderr" को अनदेखा करता हूं, तो मैं lessस्क्रीन को फिर से दबाने के लिए Ctrl-L दबाने का सुझाव देता हूं ।
kamae

जवाबों:


10

शायद

command 2> command.err | less; cat command.err; rm command.err

परिशिष्ट

यहां उन लोगों के लिए एक स्पष्टीकरण का अनुसरण किया गया है, जो प्रश्न को ध्यान से पढ़ने की उपेक्षा करते हैं और जिन्होंने ओपी की स्पष्ट टिप्पणी नहीं पढ़ी है।

haelix ने बताया:

Stderr लाइनें आम तौर पर कम के अंदर इनबेटीन stdout लाइनों को सूचीबद्ध करती हैं

और, शुरुआती उत्तर देने वालों के लिए एक टिप्पणी में लिखा:

आप मुझे बता रहे हैं कि stdout में stderr को पुनर्निर्देशित कैसे किया जाए, लेकिन यह वह नहीं है जो मैं चाहता था। मैं stderr को कम अंदर stdout के साथ मिश्रण नहीं करना चाहता। जब मैं कम बाहर निकलता हूं तो मैं टर्मिनल में रहना चाहता हूं

समस्या शायद प्लेटफ़ॉर्म विशिष्ट है, यह निश्चित रूप से कुछ है जो मैंने पुराने यूनिक्स एसवीआर 4 प्लेटफार्मों पर अनुभव किया है।

यदि, ऐसे प्लेटफार्मों पर, आप कुछ ऐसा करते हैं

 find / ... | less

किसी भी त्रुटि संदेश (जैसे निर्देशिका अनुमतियाँ) इस तरह से कम दिखाई देते हैं

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

ताकि आउटपुट लाइनें त्रुटि संदेशों द्वारा अस्पष्ट हो जाएं।

यदि आप पृष्ठ को ताज़ा करते हैं तो आउटपुट लाइनें सही तरीके से दिखाई देती हैं लेकिन आप त्रुटि संदेश खो देते हैं। जब आप कम बाहर निकलते हैं तो कमांड प्रॉम्प्ट को छोड़कर स्क्रीन को साफ कर दिया जाता है।

अगर आप कुछ ऐसा करते हैं

  find / ... 2>&1 | less

त्रुटि संदेश मानक आउटपुट के साथ परस्पर क्रिया कर रहे हैं। फिर जब आप कम बाहर निकलते हैं, तो स्क्रीन खाली होती है।

यदि आप कम में केवल मानक आउटपुट का उपयोग पहले करना चाहते हैं, तो त्रुटि संदेशों को कम से बाहर निकलने के बाद देखें, आपको एक अलग समाधान की आवश्यकता है।

यही मैं अपने मूल, दो-लाइन उत्तर में अस्थायी रूप से सुझाव दे रहा था।


यह कचरा है। जोआचिम का उत्तर स्वीकार किया जाना चाहिए।
वेनिला फेस

2
@VanillaFace: मैंने अपने उत्तर में कुछ स्पष्ट सामग्री जोड़ी है।
RedGrittyBrick

16

आपको निम्न पर पुनर्निर्देशित stderrकरना होगा stdout:

$ ./somecommad 2>&1 | less

आप खोल के लिए मैनुअल की जाँच करें (जैसे man bash।)


1
इस पुराने प्रश्न के नए पाठकों के लिए टिप्पणी (विशेष रूप से जोकिम के लिए नहीं) यह वही है जो हर कोई सवाल के पहले स्कैन पर सोचता है। लेकिन समस्या अधिक सूक्ष्म है
dmckee

2> और 1 के लिए आशुलिपि है | & | इस प्रकार, इसे सरल किया जा सकता है$ ./somecommad |& less
मेल्विन अब्राहम

1

बस शेल को 2 बताएं fd 2 से fd 1 (stdr to stdout)

 make 2>&1 | less

1

एक बात जो अब तक के सभी उत्तरों में कमी थी, वह यह है कि ऐसा क्यों हो रहा है। यहाँ समस्या यह है कि टर्मिनल से आउटपुट आउटपुट stderrऔर lessप्रदर्शित करने की प्रक्रिया के बीच किसी तरह की दौड़-हालत है stdout। यदि सभी आउटपुट टर्मिनल पर मुद्रित होने के बादless प्रदर्शित करना शुरू करते हैं , तो वह संरक्षित करेगा और बाहर निकलने के बाद आप संदेश देख सकते हैं । OTOH यदि पहले से ही सामान प्रदर्शित करना शुरू कर दिया है, तो त्रुटि संदेश आउटपुट के साथ परस्पर क्रिया करता है और बाहर निकलने के बाद कुछ भी संरक्षित नहीं होता है (क्योंकि बस टर्मिनल को संरक्षित करता है क्योंकि यह शुरू होने से पहले था और बीच में आए त्रुटि संदेशों के बारे में कुछ भी नहीं जानता है)।stderrlesslesslesslesslessless

आप इसे आसानी से देख सकते हैं, यदि आप उदाहरण के लिए करते हैं

grep foo -r /etc | less

सभी "अनुमति अस्वीकृत" त्रुटि संदेश lessआउटपुट के साथ मिलाते हैं और आपके बाहर निकलने के बाद कुछ भी नहीं होगा। यदि तुम करो

grep foo -r /etc | (sleep 10; less)

त्रुटि संदेश के सभी (या कम से कम अधिकांश) lessआउटपुट प्रदर्शित करने का मौका मिलने से पहले टर्मिनल पर मुद्रित किया गया है और आपको त्रुटि संदेश आगे दिखाई देंगे।

बेशक, आप आमतौर पर शुरू होने से पहले 10 सेकंड इंतजार नहीं करना चाहते हैं less, लेकिन लिनक्स के साथ आप प्रतीक्षा समय के लिए भिन्नात्मक मूल्यों की आपूर्ति भी कर सकते हैं, और तेजी से चल रही प्रक्रियाओं के साथ अक्सर sleep 0.1दौड़ की स्थिति से बचने के लिए पर्याप्त रूप से बहुत कम है। (लेकिन, निश्चित रूप से, यदि आप चाहते हैं या वास्तव में सुरक्षित साइड RedGrittyBrick समाधान का उपयोग करना है)।


0

आपको "फ़ाइल डिस्क्रिप्टर" की अवधारणा को समझने की आवश्यकता है। आमतौर पर, एक यूनिक्स एप्लिकेशन तीन विशेष फ़ाइल विवरणकों के साथ शुरू होगा:

  • मानक इनपुट
  • मानक उत्पादन
  • मानक त्रुटि

|शेल में "पाइप" stdoutएक प्रक्रिया stdinसे अगले के साथ जुड़ता है ।

त्रुटियां हैं - डिजाइन द्वारा - stdinअगली प्रक्रिया के लिए नहीं खिलाया गया । वे अक्सर अगले एप्लिकेशन के लिए कोई मतलब नहीं रखते हैं, और उपयोगकर्ता से छिपाया नहीं जाना चाहिए।

यदि आप त्रुटियों को स्टैडआउट में मिलाना चाहते हैं, तो आप उदाहरण के लिए उपयोग कर सकते हैं 2>&1, जो अनिवार्य रूप से कहता है "stdout को stderr जोड़ें"। उदाहरण के लिए

find /etc 2>&1 | less

दुर्गम फ़ाइलों से त्रुटि आउटपुट भी शामिल होना चाहिए।

find /etc 2>&1 >/dev/null | less

आपको केवल त्रुटियां देगा।


0

मैं आपके प्रश्न के बारे में उलझन में हूँ, जहाँ तक मैं बताता हूँ कि आपका इच्छित व्यवहार डिफ़ॉल्ट है।

जब मैं उपयोग करता हूं

#include <stdio.h>

int main(int argc, char**argv){
  for (int j=0; j<10; ++j){
    fprintf( (j%2 ? stdout : stderr) , "%d\n" , j);
  }
  return 0;
}

एक सरल परीक्षण प्राप्त करने के लिए,

$ ./testredirection | less

जो तुम पूछते हो, वही करता है। वह मैं देख रहा हूं

1
3
5
7
9
(END) 

में lessऔर

$ ./testredirection | less
0
2
4
6
8
$ 

जब मैंने छोड़ दिया less


यह अजीब है लेकिन चीजें हमेशा ऐसी नहीं होती हैं। एक स्क्रिप्ट के साथ प्रयास करें ( echo info ; echo error 1>&2) और परीक्षण दोहराएं: दोनों पंक्तियों को कम करने के लिए पाइप किया गया है।
cYrus

@ क्रेयस: यह मेरे लिए भी उम्मीद के मुताबिक काम करता है। 'कोर्स I ने मैक ओएस बॉक्स पर कोशिश की। बैश 3.2.17, कम 394. हो सकता है कि कुछ विशिष्ट लिनक्स। किसी भी स्थिति में RedGrittyBrick का दृष्टिकोण ठीक काम करना चाहिए।
dmckee --- पूर्व-संचालक ने

अजीब! डेबियन
स्क्वीज़

हाँ, मैंने काम पर वैज्ञानिक लिनक्स 5.3 बॉक्स का एक खोल खोला और bash 3.0.15 और कम 382 के साथ अपेक्षित व्यवहार प्राप्त किया। क्या वहां कोई प्रतिगमन हो सकता है?
dmckee --- पूर्व-संचालक ने

मुझे नहीं पता, मुझे लगता है कि यह केवल बफरिंग का मामला है।
cYrus

0

मैं हाल ही में अपने डेबियन 5.0 में से एक में इस समस्या का सामना करता हूं। उदाहरण के लिए, ls abc | कम मुझे लगता है कि त्रुटि संदेश कम हो जाता है, जो मेरे ज्ञान के खिलाफ है।

कुछ प्रयासों के बाद, मैंने पाया कि यह केवल स्क्रीन बफ़र्स से संबंधित कुछ है। Stderr वास्तव में कम में नहीं जाता है। आप प्रदर्शित करने के लिए ऊपर या नीचे तीर कुंजियाँ (या j / k) का उपयोग कर सकते हैं।

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