एक अपनी स्क्रिप्ट त्रुटियों को सुनिश्चित करने के अन्य तरीके के साथ ही कब्जा कर लिया है rsync त्रुटियों, ऐसा कुछ करने के लिए है:
#!/bin/bash
set -eu
set -o pipefail
exec 1>/dev/null 2> >(logger -t "stderr-from-my-script")
: do some interesting things
rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup
: do some other interesting things
अब, stderr को लिखा गया सभी डेटा लॉग इन होगा, न कि rsync से। हालांकि, stdout
को अनदेखा करना आम तौर पर एक खराब विचार है जब यह डिबगिंग की बात आती है, क्योंकि उपयोगी जानकारी जो किसी त्रुटि के कारण को हाइलाइट कर सकती है वहां लॉग किया जा सकता है। आप stderr और stdout के बीच अंतर करना चाहते हैं, बस पार नहीं करते धाराओं:
exec 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
स्पष्ट रूप से हैंडल बंद करने या उन्हें पुनर्स्थापित करने के लिए निम्न पर विचार करें:
exec {OLD_STDOUT}>&1 {OLD_STDERR}>&2 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
: Do some interesting things
eval exec 1>&${OLD_STDOUT} 2>&${OLD_STDERR} ${OLD_STDOUT}>&- ${OLD_STDERR}>&-
पुराने संस्करणों के लिए बाश के, आपको थोड़ा और अधिक धक्का होना पड़ सकता है:
exec 3>&1 4>&2 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
: Do some interesting things
exec 1>&3 2>&4 3>&- 4>&-
शायद आपका मतलब है "दोनों stdout और stderr" बजाय "STDERR" नहीं। –
वास्तव में मैं केवल stderr के बाद था, क्योंकि यह अन्यथा कोई आउटपुट उत्पन्न नहीं करना चाहिए। – Gnutt