क्या बोर्न शेल स्क्रिप्ट के सभी आउटपुट को कहीं भी रीडायरेक्ट करना संभव है, लेकिन स्क्रिप्ट के अंदर शैल कमांड के साथ ही?मैं स्क्रिप्ट के भीतर पूरी शेल स्क्रिप्ट के आउटपुट को रीडायरेक्ट कैसे करूं?
एक एकल आदेश के उत्पादन में रीडायरेक्ट कर रहा है आसान है, लेकिन मैं और अधिक कुछ इस तरह हैं:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
अर्थ: यदि स्क्रिप्ट (उदाहरण के लिए, क्रॉन के लिए) चलाया जाता है गैर सहभागी, उत्पादन बंद को बचाने एक फाइल के लिए सब कुछ। यदि एक खोल से अंतःक्रियात्मक रूप से चलाया जाता है, तो उत्पादन सामान्य रूप से stdout पर जाने दें।
मैं इसे सामान्य रूप से फ्रीबीएसडी आवधिक उपयोगिता द्वारा संचालित स्क्रिप्ट के लिए करना चाहता हूं। यह दैनिक रन का हिस्सा है, जिसे मैं आमतौर पर ईमेल में हर दिन देखने की परवाह नहीं करता, इसलिए मैंने इसे नहीं भेजा है। हालांकि, अगर इस एक विशेष स्क्रिप्ट के अंदर कुछ विफल हो जाता है, तो यह मेरे लिए महत्वपूर्ण है और मैं दैनिक नौकरियों के इस हिस्से के आउटपुट को कैप्चर और ईमेल करने में सक्षम होना चाहता हूं।
अद्यतन: यहोशू के जवाब स्पॉट पर है, लेकिन मैं यह भी बचाने के लिए और पूरी स्क्रिप्ट है, जो इस तरह से किया जाता है चारों ओर 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
$ अवधि के लिए परीक्षण का सबसे अच्छा तरीका इंटरैक्टिव मोड के लिए परीक्षण करने के लिए नहीं है। इसके बजाय, जांच करें कि क्या स्टडीन एक टीटीआई (test -t 0) है। –
दूसरे शब्दों में: यदि [! -टी 0]; फिर exec> somefile 2> & 1; फाई –
सभी अच्छाई के लिए यहाँ देखें: [http://tldp.org/LDP/abs/html/io-redirection.html](http://tldp.org/LDP/abs/html/io-redirection.html) मूल रूप से यहोशू ने क्या कहा था। exec> फ़ाइल किसी विशिष्ट फ़ाइल पर stdout को रीडायरेक्ट करता है, exec <फ़ाइल फ़ाइल द्वारा stdin को प्रतिस्थापित करता है, आदि। यह सामान्य के समान है लेकिन exec का उपयोग करना (अधिक जानकारी के लिए मैन exec देखें)। – Loki