ব্যস্তবক্স, ম্যাকোস ব্যাশ এবং নন-ব্যাশ শেলগুলির সমাধান
গৃহীত উত্তর অবশ্যই বাশের সেরা পছন্দ। আমি ব্যাশ অ্যাক্সেস ছাড়াই একটি ব্যস্তবক্স পরিবেশে কাজ করছি এবং এটি 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