POSIX कमांड / प्रक्रिया प्रतिस्थापन
_log()( x=0
while [ -e "${TMPDIR:=/tmp}/$$.$((x+=1))" ]
do continue; done &&
mkfifo -- "$TMPDIR/$$.$x" &&
printf %s\\n "$TMPDIR/$$.$x" || exit
exec >&- >/dev/null
{ rm -- "$TMPDIR/$$.$x"
logger --priority user."$1" --tag "${0##*/}"
} <"$TMPDIR/$$.$x" &
) <&- </dev/null
आपको इसका उपयोग करने में सक्षम होना चाहिए जैसे:
exec >"$(_log notice)" 2>"$(_log error)"
यहाँ एक संस्करण है जो mktemp
कमांड का उपयोग करता है :
_log()( p=
mkfifo "${p:=$(mktemp -u)}" &&
printf %s "$p" &&
exec <&- >&- <>/dev/null >&0 &&
{ rm "$p"
logger --priority user."$1" --tag "${0##*/}"
} <"$p" &
)
... जो बहुत कुछ करता है, सिवाय इसके कि यह mktemp
आपके लिए फ़ाइल नाम का चयन करने की अनुमति देता है। यह काम करता है क्योंकि प्रक्रिया प्रतिस्थापन जादुई नहीं है और प्रतिस्थापन की कमान करने के लिए एक समान तरीके से काम करता है । इसके स्थान पर कमांड रन वैल्यू के साथ विस्तार को बदलने के बजाय कमांड प्रतिस्थापन करता है, प्रक्रिया प्रतिस्थापन इसे एक फाइलसिस्टम लिंक के नाम से बदल देता है जहां आउटपुट पाया जा सकता है।
हालांकि POSIX खोल ऐसी चीज़ को प्रत्यक्ष रूप से प्रदान नहीं करता है, इसका अनुकरण करना बहुत सरलता से किया जाता है। आपको बस एक फ़ाइल बनाने की ज़रूरत है, उसके नाम को कमांड प्रतिस्थापन के मानक पर प्रिंट करें, और उसी के बैकग्राउंड में अपना कमांड चलाएं जो उस फ़ाइल पर आउटपुट करेगा। अब आप बस उस विस्तार के मूल्य में पुनर्निर्देशित कर सकते हैं - ठीक वैसे ही जैसे आप प्रक्रिया प्रतिस्थापन के साथ करते हैं। और इसलिए POSIX शेल आपको निश्चित रूप से आवश्यक सभी उपकरण प्रदान करता है - यह सब आवश्यक है कि आप उन्हें एक तरह से उपयोग करने के लिए डालते हैं जो आपको सूट करता है।
उपरोक्त दोनों संस्करण यह सुनिश्चित करते हैं कि वे अपने द्वारा बनाए गए उपयोग से पहले उनके द्वारा बनाए गए पाइपों के लिए फाइलसिस्टम लिंक को नष्ट कर दें। इसका मतलब है कि इस तथ्य के बाद कोई सफाई की आवश्यकता नहीं है, और, अधिक महत्वपूर्ण बात, उनकी धाराएं केवल उन प्रक्रियाओं के लिए उपलब्ध हैं जो शुरू में उन्हें खोलती हैं - और इसलिए उनके फाइलसिस्टम लिंक को आपकी लॉगिंग गतिविधि को स्नूप / हाइजैक करने के साधन के रूप में उपयोग नहीं किया जा सकता है। फाइलसिस्टम में अपने एफएस-लिंक को छोड़ने के लिए एक संभावित सुरक्षा छेद है।
दूसरा तरीका यह है कि इसे लपेटें। इसे स्क्रिप्ट के भीतर से किया जा सकता है।
x=${x##*[!0-9]*}
_log(){
logger --priority user."$1" --tag "${0##*/}"
} 2>/dev/null >&2
cd ../"$PPID.$x" 2>/dev/null &&
trap 'rm -rf -- "${TMPDIR:-/tmp}/$PPID.$x"' 0 ||
{ until cd -- "${TMPDIR:=/tmp}/$$.$x"
do mkdir -- "$TMPDIR/$$.$((x+=1))"
done &&
x=$x "$0" "$@" | _log notice
exit
} 2>&1 | _log error
यह मूल रूप से आपकी स्क्रिप्ट को स्वयं को कॉल करने की अनुमति देगा यदि यह अभी तक नहीं है और आपको टेम्प में बूट करने के लिए कार्य निर्देशिका मिल सकती है।