बिजीबॉक्स, मैकओएस बैश और नॉन-बैश शेल के लिए समाधान
स्वीकार किए गए जवाब निश्चित रूप से बैश के लिए सबसे अच्छा विकल्प है। मैं bash की पहुंच के बिना एक बिजीबॉक्स वातावरण में काम कर रहा हूं, और यह exec > >(tee log.txt)
सिंटैक्स को नहीं समझता है । यह भी exec >$PIPE
ठीक से नहीं करता है, नामांकित पाइप के समान नाम के साथ एक साधारण फ़ाइल बनाने की कोशिश कर रहा है, जो विफल और लटका हुआ है।
उम्मीद है कि यह किसी और के लिए उपयोगी होगा जिसके पास बैश नहीं है।
इसके अलावा, नामित पाइप का उपयोग करने वाले किसी भी व्यक्ति के लिए, यह सुरक्षित है rm $PIPE
, क्योंकि यह वीएफएस से पाइप को अनलिंक करता है, लेकिन इसका उपयोग करने वाली प्रक्रियाएं अभी भी उस पर एक संदर्भ गणना बनाए रखती हैं जब तक कि वे समाप्त न हो जाएं।
ध्यान दें कि $ * का उपयोग आवश्यक रूप से सुरक्षित नहीं है।
#!/bin/sh
if [ "$SELF_LOGGING" != "1" ]
then
# The parent process will enter this branch and set up logging
# Create a named piped for logging the child's output
PIPE=tmp.fifo
mkfifo $PIPE
# Launch the child process with stdout redirected to the named pipe
SELF_LOGGING=1 sh $0 $* >$PIPE &
# Save PID of child process
PID=$!
# Launch tee in a separate process
tee logfile <$PIPE &
# Unlink $PIPE because the parent process no longer needs it
rm $PIPE
# Wait for child process, which is running the rest of this script
wait $PID
# Return the error code from the child process
exit $?
fi
# The rest of the script goes here