क्या बॉर्न शेल स्क्रिप्ट के सभी आउटपुट को कहीं पर पुनर्निर्देशित करना संभव है, लेकिन स्क्रिप्ट के अंदर शेल कमांड के साथ?
एकल कमांड के आउटपुट को पुनर्निर्देशित करना आसान है, लेकिन मैं इस तरह से कुछ और करना चाहता हूं:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
अर्थ: यदि स्क्रिप्ट को गैर-संवादात्मक रूप से चलाया जाता है (उदाहरण के लिए, क्रोन), तो फ़ाइल के लिए सब कुछ के आउटपुट को सहेजें। यदि एक शेल से अंतःक्रियात्मक रूप से चलाया जाता है, तो आउटपुट को हमेशा की तरह गतिरोध में जाने दें।
मैं इसे सामान्य रूप से फ्रीबीएसडी आवधिक उपयोगिता द्वारा संचालित स्क्रिप्ट के लिए करना चाहता हूं। यह दैनिक रन का हिस्सा है, जिसे मैं ईमेल में हर दिन देखने के लिए सामान्य रूप से परवाह नहीं करता, इसलिए मैंने इसे नहीं भेजा है। हालांकि, अगर इस एक विशेष स्क्रिप्ट के अंदर कुछ विफल हो जाता है, तो यह मेरे लिए महत्वपूर्ण है और मैं दैनिक नौकरियों के इस एक हिस्से के उत्पादन को पकड़ने और ईमेल करने में सक्षम होना चाहता हूं।
अद्यतन: यहोशू का जवाब हाजिर है, लेकिन मैं पूरी स्क्रिप्ट के बारे में stdout और stderr को सहेजना और पुनर्स्थापित करना चाहता था, जो इस प्रकार किया जाता है:
# save stdout and stderr to file descriptors 3 and 4, then redirect them to "foo"
exec 3>&1 4>&2 >foo 2>&1
# ...
# restore stdout and stderr
exec 1>&3 2>&4
exec 1>&3 2>&4 3>&- 4>&-