मैं मान रहा हूं कि आप अभी भी टर्मिनल पर STDERR और STDOUT देखना चाहते हैं। आप जोश केली के जवाब के लिए जा सकते हैं, लेकिन मुझे लगता tail
है कि बैकग्राउंड में जो कि आपके लॉग फाइल को बहुत ही हैकिश और क्लूडी के आउटपुट देता है। ध्यान दें कि आपको एक्सरा एफडी रखने की आवश्यकता है और इसे मारने के बाद सफाई करें और तकनीकी रूप से ऐसा करना चाहिए trap '...' EXIT
।
ऐसा करने का एक बेहतर तरीका है, और आप इसे पहले ही खोज चुके हैं tee
:।
केवल, अपने स्टडआउट के लिए इसका उपयोग करने के बजाय, स्टडआउट के लिए टी और स्टडर के लिए एक है। आप इसे कैसे पूरा करेंगे? प्रक्रिया प्रतिस्थापन और फ़ाइल पुनर्निर्देशन:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
आइए इसे अलग करें और समझाएं:
> >(..)
>(...)
(प्रक्रिया प्रतिस्थापन) एक फीफो बनाता है और tee
उस पर सुनने देता है। फिर, यह FIFO >
के STDOUT को पुनर्निर्देशित करने के लिए (फ़ाइल पुनर्निर्देशन) का उपयोग करता है command
जिसे आपका पहला tee
सुन रहा है।
दूसरी के लिए एक ही बात:
2> >(tee -a stderr.log >&2)
हम tee
एसटीडीआईएन से पढ़ी जाने वाली प्रक्रिया को बनाने के लिए फिर से प्रक्रिया प्रतिस्थापन का उपयोग करते हैं और इसमें डंप करते हैं stderr.log
। tee
STDOUT पर इसके इनपुट को वापस आउटपुट करता है, लेकिन चूंकि इसका इनपुट हमारा STDERR है, इसलिए हम tee
अपने STDERR के बारे में फिर से अप्रत्यक्ष करना चाहते हैं। फिर हम फ़ाइल पुनर्निर्देशन का उपयोग command
FIFO के इनपुट ( tee
'STDIN) में' STDERR ' को पुनर्निर्देशित करते हैं ।
Http://mywiki.wooledge.org/BashGuide/InputAndOutput देखें
प्रक्रिया प्रतिस्थापन उन बहुत ही प्यारी चीजों में से एक है जो आपको bash
अपने शेल के रूप में चुनने के बोनस के रूप में मिलती है sh
(पोसिक्स या बॉर्न) के विपरीत ।
में sh
, आपको चीजों को मैन्युअल रूप से करना होगा:
out="${TMPDIR:-/tmp}/out.$$" err="${TMPDIR:-/tmp}/err.$$"
mkfifo "$out" "$err"
trap 'rm "$out" "$err"' EXIT
tee -a stdout.log < "$out" &
tee -a stderr.log < "$err" >&2 &
command >"$out" 2>"$err"