कुछ लिनक्स कार्यक्रमों का आउटपुट न तो STDOUT और न ही STDERR पर जाता है?


21

कुछ लिनक्स कार्यक्रमों का आउटपुट न तो STDOUT और न ही STDERR पर जाता है?

वास्तव में, मैं जानना चाहता हूं कि सभी प्रोग्राम आउटपुट को मज़बूती से कैसे कैप्चर किया जाए, इससे कोई फर्क नहीं पड़ता कि यह किस 'स्ट्रीम' का उपयोग करता है। मेरे पास समस्या यह है कि कुछ प्रोग्राम अपने आउटपुट को कैप्चर करने नहीं देते हैं।

एक उदाहरण 'समय' है:

time sleep 1 2>&1 > /dev/null

real        0m1.003s
user        0m0.000s
sys         0m0.000s

या

time sleep 1 &> /dev/null

real        0m1.003s
user        0m0.000s
sys         0m0.000s

मुझे दोनों समय आउटपुट क्यों दिखाई देता है? मुझे उम्मीद थी कि यह सब / देव / अशक्त हो जाएगा

समय का उपयोग करते हुए क्या आउटपुट स्ट्रीम है, और मैं इसे एक फ़ाइल में कैसे पाइप कर सकता हूं?

समस्या के चारों ओर काम करने का एक तरीका है बैश स्क्रिप्ट बनाना , उदाहरण के लिए, combine.shजिसमें यह कमांड है:

$@ 2>&1

फिर 'टाइम' के आउटपुट को सही तरीके से कैप्चर किया जा सकता है:

combine.sh time sleep 1 &> /dev/null

(कोई आउटपुट नहीं देखा गया - सही)

क्या एक अलग संयोजन स्क्रिप्ट का उपयोग किए बिना मैं जो चाहता हूं उसे प्राप्त करने का एक तरीका है?


3
पहले आपको आदेश को उल्टा करना चाहिए: 2>&1 > /dev/null"2" अब 1 पर जाता है (यानी, टर्मिनल, डिफ़ॉल्ट रूप से), और फिर 1 अब / देव / शून्य पर जाता है (लेकिन 2 अभी भी टर्मिनल पर जाता है!) >/dev/null 2>&1कहने के लिए उपयोग करें। "मैं अब 1 / dev / null में जाता हूं, फिर 2 1 पर जाता है (यानी, / dev / null के लिए)। यह अभी भी यहाँ काम नहीं करेगा क्योंकि निर्मित 'समय' पुनर्निर्देशित नहीं होगा, लेकिन आम तौर पर सही है (उदाहरण के लिए यदि आप उपयोग करते हैं तो यह काम करेगा / usr / bin / time)। "2> और 1" के बारे में 1 में 1 की "दिशा" की नकल करने के बारे में सोचें, 2 के रूप में 1 से 1 तक नहीं जा रहा है
ओलिवियर दुलक

जवाबों:


38

यह प्रश्न BashFAQ / 032 में संबोधित किया गया है । आपके उदाहरण में, आप:

{ time sleep 1; } 2> /dev/null

कारण क्यों

time sleep 1 2>/dev/null

व्यवहार नहीं करता है कि आप कैसे उम्मीद कर रहे हैं क्योंकि उस वाक्य रचना के साथ, आप timeकमांड sleep 1 2>/dev/null(हाँ, stderr केsleep 1 साथ कमांड पुनर्निर्देशित ) चाहते हैं। बिल्टिन इस तरह से काम करता है ताकि यह वास्तव में संभव हो सके।/dev/nulltime

bash Builtin क्योंकि ... अच्छी तरह से, यह अंतर्निहित है वास्तव में ऐसा कर सकते हैं। इस तरह का व्यवहार timeआमतौर पर बाहरी आदेश के साथ असंभव होगा /usr/bin। वास्तव में:

$ /usr/bin/time sleep 1 2>/dev/null
$

अब, आपके प्रश्न का उत्तर

कुछ लिनक्स प्रोग्राम का आउटपुट न तो STDOUT और न ही STDERR में क्यों जाता है?

है: यह करता है, आउटपुट stdout या stderr पर जाता है ।

उम्मीद है की यह मदद करेगा!


2
आप अन्य fd बना सकते हैं और आदेशों को स्पष्ट रूप से उन पर जा सकते हैं (उदाहरण: bash script में exec 3>/some/file ; ls >&3 ;) :
Olivier Dulac

@OlivierDulac ज़रूर, या बिलिन के साथ भी सरल coproc। लेकिन यह timeबिलिन के लिए मामला नहीं है ।
गनीउर_ग्निउरफ

@ gniourf-gniourf: मैं आपके वाक्य के कारण टिप्पणी कर रहा था "आउटपुट stdout या stderr पर जाता है" ^ ^
ओलिवियर दुलैक

14

के बारे में आपका खास सवाल timebuiltin उत्तर दिया गया है, लेकिन वहाँ हैं कुछ आदेश है कि या तो नहीं लिख stdoutया करने के लिए stderr। एक क्लासिक उदाहरण यूनिक्स कमांड है cryptcryptबिना किसी तर्क के मानक इनपुट को एन्क्रिप्ट करता है stdinऔर इसे मानक आउटपुट में लिखता है stdout। यह उपयोगकर्ता को पासवर्ड का उपयोग करने के लिए प्रेरित करता है getpass(), जो कि चूक से एक संकेत देता है /dev/tty/dev/ttyवर्तमान टर्मिनल डिवाइस है। के लिए लिख /dev/ttyवर्तमान टर्मिनल के लिए लेखन का प्रभाव (यदि वहाँ एक है, को देखने के है isatty())।

इसका कारण cryptयह नहीं लिखा जा सकता stdoutक्योंकि यह एन्क्रिप्टेड आउटपुट को लिखता है stdout। इसके अलावा, यह /dev/ttyलिखने के बजाय संकेत देने के लिए बेहतर है stderrकि यदि कोई उपयोगकर्ता पुनर्निर्देशित करता है stdoutऔर stderr, फिर भी संकेत दिखाई देता है। (इसी कारण cryptसे stdin, पासवर्ड को पढ़ नहीं सकते , क्योंकि इसका उपयोग डेटा को एन्क्रिप्ट करने के लिए पढ़ने के लिए किया जा रहा है।)


2
+1। ओपी के लिए कम प्रासंगिक है, लेकिन हर किसी के लिए अधिक प्रासंगिक है "कुछ लिनक्स कार्यक्रमों का आउटपुट न तो STDOUT और न ही STDERR के लिए क्यों जाता है?" Google के माध्यम से। :-)
३:१३

0

time sleep 1 > /dev/null 2>&1# पुनर्निर्देशित "नींद" का आउटपुट अशक्त करता है। फिर, "समय" अपना स्वयं का आउटपुट लिखता है, जिसमें कोई पुनर्निर्देशन नहीं है। यह " time (sleep 1 > /dev/null 2>&1)" जैसा है ।

(time sleep 1) > /dev/null 2>&1 # "टाइम स्लीप 1" चलता है, फिर इसके आउटपुट को शून्य पर रीडायरेक्ट करता है।

[] रों


-1

आपके मामले में समस्या यह है कि पुनर्निर्देशन दूसरे तरीके से काम करता है। आप ने लिखा

time sleep 1 2>&1 > /dev/null

यह मानक आउटपुट को /dev/nullरीडायरेक्ट करता है और फिर मानक त्रुटि को मानक आउटपुट पर रीडायरेक्ट करता है।

सभी आउटपुट को रीडायरेक्ट करने के लिए आपको लिखना होगा

time sleep 1 > /dev/null 2>&1 

फिर मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित किया जाएगा और उसके बाद सभी मानक आउटपुट (मानक त्रुटि वाले) को पुनर्निर्देशित किया जाएगा /dev/null


यह बाश बेसिन के साथ काम नहीं करता है time। कुछ स्पष्टीकरण के लिए मेरा जवाब देखें।
११:०४ बजे गनीउर्फ_ग्निउरफ

+1 क्योंकि यह एक समान प्रश्न का उपयोगी उत्तर है। हालांकि @Olivier ने ऊपर दिए सवाल के लिए टिप्पणी में इसे बेहतर बताया।
शेपर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.