bash: फ़ाइल के लिए -x लॉग सेट करता है


18

मेरे पास एक शेल स्क्रिप्ट है जिसमें set -xक्रिया / डिबग आउटपुट है:

#!/bin/bash

set -x
command1
command2
...

आउटपुट इस तरह दिखता है:

+ command1
whatever output from command1
+ command2
whatever output from command2

मेरी समस्या है, खोल निर्गम (की वजह से set -x) stderr, आदेशों की निर्गम (के साथ मिश्रित करने के लिए चला जाता है command1, command2, ...)। मुझे स्क्रीन पर "सामान्य" आउटपुट (बिना स्क्रिप्ट के जोर-शोर से चलने set -x) और "अतिरिक्त" बैश के आउटपुट को एक फाइल में अलग करने में खुशी होगी ।

इसलिए मैं इसे स्क्रीन पर रखना चाहूंगा:

whatever output from command1
whatever output from command2

और यह एक लॉग फ़ाइल में:

+ command1
+ command2

(यह भी ठीक है अगर लॉग फ़ाइल में सब कुछ एक साथ है)

set -x 2> fileजाहिर है doens't, सही प्रभाव में लाने क्योंकि यह सेट आदेश के उत्पादन में नहीं है, लेकिन यह पार्टी का व्यवहार बदलने के।

bash 2> fileसंपूर्ण स्क्रिप्ट का उपयोग करना भी सही काम नहीं करता है, क्योंकि यह प्रत्येक कमांड के स्टडर को पुनर्निर्देशित करता है जो इस शेल में भी चलता है, इसलिए मुझे कमांड का त्रुटि संदेश दिखाई नहीं देता है।


2
मेरा गूगल-फू आज सुबह मजबूत लग रहा है: मानक आउटपुट को
इंटर

जवाबों:


21

इस सर्वरफॉल्ट उत्तर के आधार पर , मानक आउटपुट को इंटर किए बिना लॉगफाइल में bash -x आउटपुट भेजें, bash के आधुनिक संस्करणों में BASH_XTRACEFDविशेष रूप से सर्वर के आउटपुट के लिए एक वैकल्पिक फ़ाइल डिस्क्रिप्टर निर्दिष्ट करने के लिए शामिल हैंset -x

तो उदाहरण के लिए आप कर सकते हैं

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

निम्न कमांड के लिए नियमित मानक आउटपुट और मानक त्रुटि धाराओं को संरक्षित करते हुए set -xफ़ाइल के आउटपुट को भेजने के logfileलिए।

ध्यान दें कि fd 19 का उपयोग मनमाना है - इसे केवल एक उपलब्ध डिस्क्रिप्टर (यानी 0, 1, 2 या कोई अन्य संख्या जो आपको पहले से आवंटित है) होना चाहिए।


यह वास्तव में bash ट्रेस लॉग को अलग से बचाता है, हालाँकि यह पूरी तरह से सिंक से बाहर होने के कारण 2 आउटपुट (स्क्रीन पर stdout + stderr और लॉग फ़ाइलों में bash ट्रेस) को पढ़ने के लिए वास्तव में कठिन बनाता है। समाधान देखें जो मैंने अभी पोस्ट किया है
redseven

4

एक वर्ष से अधिक समय के बाद मैंने स्क्रीन पर "सामान्य" आउटपुट (stdout + stderr - bash ट्रेस) दोनों को एक साथ और एक फाइल (bash .log) में सभी एक साथ (stdout + stderr + bash ट्रेस) होने का सही समाधान पाया है। :

exec   > >(tee -ia bash.log)
exec  2> >(tee -ia bash.log >& 2)
exec 19> bash.log

export BASH_XTRACEFD="19"
set -x

command1
command2

यह स्टीलड्राइवर के उत्तर का संयोजन है और यह एक है
जरनू

3

स्टीलड्राइवर ने आपको एक दृष्टिकोण दिया । वैकल्पिक रूप से, आप बस STDERR को एक फ़ाइल में पुनर्निर्देशित कर सकते हैं:

script.sh 2> logfile

हालांकि, इसका मतलब है कि set -xविकल्प द्वारा निर्मित और आउटपुट किए गए किसी भी अन्य त्रुटि संदेश दोनों फ़ाइल में जाएंगे। Steeldriver का समाधान केवल उस set -xआउटपुट को पुनर्निर्देशित करेगा जो संभवतः आप चाहते हैं।


"... सेट -x विकल्प और निर्मित किसी भी अन्य त्रुटि संदेश द्वारा बनाए गए दोनों आउटपुट फ़ाइल में जाएंगे।" और इसीलिए यह मेरे लिए काम नहीं करता है। मेरा मुख्य मुद्दा यह है, मैं आसानी से "वास्तविक त्रुटियों" को नहीं देखता, क्योंकि यह सभी बैश आउटपुट स्टैडर में जाता है। कमांड एरर मैसेज को रीडायरेक्ट करने से मुझे एक अलग तरीके से "रियल एरर्स" भी छुप जाएगा।
redseven

@redseven मुझे डर है कि आप जो माँग रहे हैं वह बहुत स्पष्ट नहीं है। क्या आप अपना प्रश्न संपादित कर सकते हैं और स्पष्ट कर सकते हैं? "आउटपुट" शब्द के उपयोग से बचने की कोशिश करें जो किसी चीज के लिए नहीं है जो स्टडआउट नहीं जा रहा है। क्या आप अलग करना चाहते हैं) सामान्य आउटपुट; ii) आपके कमांड और iii) सेट -x द्वारा फेंकी गई कोई भी त्रुटि? क्या स्टीलड्राइवर का जवाब पर्याप्त नहीं है? यदि नहीं, तो हमें एक सरल स्क्रिप्ट दिखाएं जिसे हम कॉपी कर सकते हैं और हमें बता सकते हैं कि आप इसे कैसे व्यवहार करना चाहते हैं।
टेराडॉन

@steeldriver पहले ही सवाल का पूरी तरह से जवाब दे चुका है।
redseven

@ श्रेयस आह, फिर ठंडा। चूँकि आपकी टिप्पणी इतनी बाद में आई, मुझे लगा कि आपको अभी भी कुछ चाहिए था और मैं नहीं देख सकता था कि स्टीलड्राइवर का उत्तर आपके मुद्दे को हल करने में कैसे विफल रहा। खुशी है कि यह सब तो हल है।
टेराडॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.