आउटपुट को पुनर्निर्देशित कैसे करें और कमांड विफलता पर बाहर निकलें?


1

इस तरह से मैं अपनी स्क्रिप्ट्स (आमतौर पर क्रोनोजर) में स्टडआउट और स्टादर दोनों को लॉग करता हूं:

#!/bin/bash
mylog() {
    echo "[`date '+%Y-%m-%d %H:%M:%S'`] $1"
}
(
mylog 'start'

some-command || mylog 'error' && exit 1

mylog 'end'
) >> /var/log/my-log.log 2>&1

कुछ स्क्रिप्ट में मैं बाहर निकलने के बजाय रिटर्न का उपयोग करता हूं और ठीक काम करता हूं, लेकिन अब यह कहता है कि मैं रिटर्न का उपयोग नहीं कर सकता जब तक कि मैं स्क्रिप्ट को src के साथ शामिल नहीं करता या किसी फ़ंक्शन में उपयोग नहीं करता। इसलिए मैंने इसे बाहर निकलने के लिए बदल दिया, लेकिन समस्या यह है कि यह कुछ भी लॉग नहीं करता है, ऐसा लगता है कि यह >> आउटपुट पुनर्निर्देशन को रोकता है। एक और समस्या यह है कि मैं इसे src के साथ बाद में शामिल नहीं कर पाऊंगा, क्योंकि मैं केवल इस स्क्रिप्ट को रोकना चाहता हूं, सब कुछ नहीं।

मैं आउटपुट पुनर्निर्देशन का उपयोग करता हूं क्योंकि मैं सब कुछ लॉग करना चाहता हूं, भले ही कोई त्रुटि न हुई हो। और कभी-कभी आदेश भी उचित निकास कोड वापस नहीं करते हैं, इसलिए मैं उस पर भरोसा नहीं कर सकता।

तो मैं त्रुटि पर 'वापसी' कैसे कर सकता हूं? मुझे 'सेट-ई' के बारे में पता है, लेकिन मैं स्क्रिप्ट को रोकने के लिए अधिक नियंत्रण रखना पसंद करता हूं।

कोई विचार?

जवाबों:


1

मैं आपके द्वारा अनुभव किए जा रहे व्यवहार की व्याख्या नहीं कर सकता, लेकिन यहां एक संभावित समाधान है:

#! / Bin / bash
mylog () {
    इको "[$ (तारीख '+% Y-% m-% d% H:% M:% S')] १"
}

मेरा मुख्य() {
    (
        mylog 'प्रारंभ'

        कुछ-कुछ आदेश || mylog 'त्रुटि' && वापसी 1

        mylog 'अंत'
    ) >> /var/log/my-log.log 2> & 1
}

मेरा मुख्य

वैकल्पिक रूप से, mymainफ़ंक्शन परिभाषा से पुनर्निर्देशन को हटा दें और इसे mymainफ़ंक्शन कॉल पर रखें:

mymain >> /var/log/my-log.log 2>&1

(आपको mymainफ़ंक्शन की परिभाषा से कोष्ठकों को हटाने में सक्षम होना चाहिए , तब भी।) वैकल्पिक रूप से, जब आप चाहते हैं कि IO को संपूर्ण स्क्रिप्ट के लिए पुनर्निर्देशित किया जाए , तो आप एक्शन स्टेटमेंट के अलावा पुनर्निर्देशन को तोड़ सकते हैं:

exec >> /var/log/my-log.log
2> और 1 निष्पादित करें
मेरा मुख्य

चूँकि मुझे समझ नहीं आ रहा है कि आपका दृष्टिकोण क्यों विफल हो रहा है, मैं यह नहीं समझा सकता हूँ कि उपरोक्त में से कोई भी वांछित के रूप में काम करने की अधिक संभावना है। हालांकि, वे एक ही काम करने के कुछ अलग तरीके हैं, और यह सिर्फ पर्याप्त हो सकता है। वैसे, मैं सिर्फ सामान्य कारणों `date …`से बदल गया $(date …); मैं नहीं मानता कि आपकी समस्या का कोई लेना देना है।


हां, मैंने म्यामां का उपयोग करने के बारे में सोचा। यह काफी हो सकता है, मैं कोशिश करूंगा कि, धन्यवाद।
चोकोडेवेलपर 22

0

screenलिनक्स में कमांड का उपयोग कैसे करें ? यह चाल के कारण होगा जब तक कि आप अपने आप को एक समाधान प्रोग्रामिंग पर दिल नहीं लगाते।

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