STDERR से पहले STDOUTs प्रदर्शित करें?


9

मैं बैश करने के लिए नया हूं और मैं अपने जीवन के लिए यह पता नहीं लगा सकता कि कैसे एक निश्चित कमांड को चलाने के लिए, मान लें ./fffऔर नियमित रूप से स्टडर से पहले प्रिंट करें (मैं स्वयं अर्थ के बारे में भ्रमित हूं)

उदाहरण के लिए

$ printf "I am a\ndrill\n" > fff; 
$ cat fff nofile fff nofile fff

I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill

जैसे प्रिंट करने की जरूरत है:

I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory

मैं समझता हूं कि मुझे अपने आउटपुट को पहले एक फ़ाइल पर पुनर्निर्देशित करना होगा और फिर उसी फ़ाइल में त्रुटि को जोड़ना होगा लेकिन यह वह आउटपुट है जो मैं चाहता हूं

$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see 

I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory

2
क्या catवास्तव में "कुछ" द्वारा "ए" को बदल दिया गया?
दिमित्री ग्रिगोरीव

ओह खतरे मैं स्ट्रिंग गड़बड़ हो सकती है। मैं इसे अभी संपादित करूंगा @DmitryGrigoryev
MeOw

जवाबों:


18

आपको स्टैडर आउटपुट को कहीं भी रखने की आवश्यकता होगी ताकि इसे अंत में प्रदर्शित किया जा सके।

एक फाइल दिमाग में आती है:

fff 2> file; cat file >&2

या मेमोरी (यहाँ से उपयोग spongeकर moreutils):

{ fff 2>&1 >&3 3>&- | sponge >&2 3>&-; } 3>&1
  • {...} 3>&1: {...}फ़ाइल डिस्क्रिप्टर (fd) के भीतर मूल stdout के समान संसाधन के लिए 3 अंक (इसलिए हम इसका उपयोग stdout को पुनर्स्थापित करने के लिए कर सकते हैं fff)।
  • fff <redirs> | sponge <redirs>, fffऔर spongeसमवर्ती ( <redirs>स्वतंत्र रूप से लागू किया गया) fffएक पाइप में जाने वाले स्टडआउट के साथ शुरू किया , और पाइप spongeके दूसरे छोर पर स्टडिन है।
  • 2>&1: fd 2 of fff(stderr) 1 के समान बिंदु पर इंगित करता है: इस बिंदु पर पाइप, इसलिए fffत्रुटि spongeउस पाइप से होकर जाती है।
  • >&3: अब स्टडआउट मूल स्टडआउट की ओर इंगित करता है (यह क्या था वापस रीडायरेक्ट करें)
  • 3>&-: हम fd 2 को बंद करते हैं जिसकी fffआवश्यकता नहीं है
  • spongeइसके इनपुट को संचित करता है और केवल इसे प्रदर्शित करता है (इसके स्टैडआउट पर जिसे >&2उसी संसाधन से stderr के रूप में पुनर्निर्देशित किया गया है ) इसके स्टैन पर ईओफ़ का पता लगाने के बाद (यह माना जाता है कि जब fffसमाप्त हो जाता है और पहले से ही अपने सभी आउटपुट को अपने स्टडआउट में लिखा है)।

यदि spongeस्थापित नहीं है, तो आप इसे बदल सकते हैं perl -0777 -pe ''। के साथ -pe '', perlअपने इनपुट से एक बार में एक रिकॉर्ड पढ़ता है और इसे stdout पर लिखता है। -0777स्लुरप मोड है, जहां (उस मामले में केवल एक) रिकॉर्ड पूरे इनपुट है।


यदि आपके पास समय हो तो कृपया इसे तोड़ दें!
जॉर्ज उदेन

क्या हम teeइसके बदले sponge... का उपयोग कर सकते हैं ?
जॉर्ज वासिलियो

@GeorgeUdosen संपादन देखें।
स्टीफन चेजेलस

1
@GeorgeVasiliou, teeडेटा नहीं रखता है, यह इसे पढ़ते ही लिखता है।
स्टीफन चेजालस

2
@MeOw: यह ठीक है, लेकिन, स्टीफन के जवाब की तीसरी पंक्ति के रूप में, आपको स्टॉटआउट को बचाने की आवश्यकता नहीं है; बस करो cat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt। (और आप शायद डॉन टी का उपयोग करना चाहते >>।) इसके अलावा, स्टीफन उत्कृष्ट मुद्दा यह है कि आप शायद करना चाहिए बनाता है cat ferr.txt >&2stderr जानकारी लिखने के लिए करने के लिए stderr।
जी-मैन का कहना है कि 'मोनिका'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.