Stderr और stdout को विभिन्न फ़ाइलों में रीडायरेक्ट कैसे करें और टर्मिनल में भी प्रदर्शित करें?


30

मैं टर्मिनल में एक कमांड के आउटपुट को देखना चाहता हूं जैसे कि कोई पुनर्निर्देशन नहीं था। इसके अलावा, stderr को अनियमित करने के लिए पुनर्निर्देशित किया जाना चाहिए। और stdout को stdout.log पर पुनर्निर्देशित किया जाना चाहिए।

यह भी अच्छा होगा कि टर्मिनल में जो दिखाया गया है, उसकी सटीक कॉपी हो, यानी एक अलग फाइल में: जब यह अलग-अलग फाइल में होता है, तब यह प्रिंट हो जाता है: stdouterr.log।


@ नोनो नहीं यह नहीं है। ओपी स्टडआउट और स्टेडर के लिए अलग-अलग फाइलें रखना चाहता है।
डॉगबैन

@dogbane हां, आप सही कह रहे हैं। उसके लिए माफ़ करना।
नूनो सी। इनसियो

मुझे अभी भी यह प्रश्न बहुत ही परिचित लगता है। मुझे देखने दो ... यहाँ एक बहुत समान है unix.stackexchange.com/q/4195/250 , और यहाँ एक संबंधित एक है unix.stackexchange.com/q/1416/250
phunehehe

जवाबों:


37

teeनिम्नानुसार कमांड का उपयोग करें :

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 यह है कि आप stderr और stdout को कैसे स्वैप करते हैं, क्योंकि टी केवल stdout को स्वीकार कर सकता है।

उपयोग करने वाले अधिक उन्नत पुनर्निर्देशन के लिए यूनिक्स टी कमान पर एक नज़र डालें tee


अच्छा समाधान। क्या cmd एक्जिट कोड प्राप्त करने का कोई तरीका है?
टर्बनऑफ

2
@turbanoff cmdसाथ बदलें (cmd ; echo >exit_code.txt $?)
पार्थियन शॉट

मेरा मानना ​​है कि यह बेहतर होगा कि कमांड लाइन को आउटपुट चीजों के क्रम को संरक्षित किया जाए:((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
TTT

5

मुझे लगता है कि दो अलग-अलग फाइलों में स्टडआउट और स्टडर को लॉग करना एक शानदार विचार है। क्या यह लॉग को अतुल्यकालिक नहीं बनाता है? इसलिए मैंने निम्नलिखित कोशिश की:

  • stdout को "stdout.log" (डॉगबने के रूप में सुझाया गया)
  • "stderr.log" (डॉगबने जैसा सुझाव दिया गया)
  • सभी आउटपुट "all.log" और
  • अभी भी डिस्प्ले पर आउटपुट देखने में सक्षम है (हालांकि एक अलग टर्मिनल में!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

दूसरे टर्मिनल में

tail -f --sleep-interval=2 all.log

क्या सीधे स्टेटर को दूसरी ट्टी पर निर्देशित करना संभव नहीं है? फिर कोई लॉगफाइल की आवश्यकता नहीं है।
स्टीवन लू

@StevenLu हाँ, अगर आपको नाम पता है और जो किया जा सकता है, उसे दूसरे tty को लिखने की अनुमति है।
जैसन

1
&| tee all.logइसके बजाय कमांड की समाप्ति पर आसान होगा&> all.log
जैसन डिक

@ जासेन: दूसरी बार मैं देख रहा हूं &|। मैं समझता हूँ &>, |&भी, लेकिन क्या करता है &|इस संदर्भ में क्या मतलब है? मुझे एक उपयुक्त वाक्यविन्यास संदर्भ नहीं मिला, नेट पर नहीं, बैश मैनुअल पेज "बैश (1)" से परामर्श भी नहीं ... Tx
Cbhihe

1
@ जब तक मैं बता सकता हूं कि यह कुछ नहीं करता है, मेरा कहने का मतलब था|&
जसन

3

@ डॉगबेन, धन्यवाद।
मुझे एक और तरीका भी मिला, जो दोनों धाराओं को लगभग उसी क्रम में बचाता है जैसे वे पुनर्निर्देशन के बिना मुद्रित हो जाते हैं।

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

लेकिन यह केवल गोले के साथ काम करता है जो प्रक्रिया प्रतिस्थापन का समर्थन करता है।


-2

इसे इस्तेमाल करे :

command 2>&1 | tee bothLog

4
नमस्ते वासिल, यह इस सवाल का जवाब नहीं देता: बाल्की को स्टडआउट और स्टेडर के लिए अलग-अलग फ़ाइलों की आवश्यकता होती है, आपका समाधान एक ही स्ट्रीम में दोनों को मिलाएगा।
Mat

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