Рішення для busbox, macOS bash та не-bash оболонок
Прийнята відповідь, безумовно, найкращий вибір для баш. Я працюю в середовищі Busybox без доступу до bash, і він не розуміє exec > >(tee log.txt)
синтаксис. Це також не робиться exec >$PIPE
належним чином, намагаючись створити звичайний файл з такою ж назвою, що і названа труба, яка виходить з ладу і зависає.
Сподіваємось, це було б корисно для когось іншого, хто не має башти.
Крім того, для всіх, хто використовує іменовану трубку, це безпечно rm $PIPE
, оскільки це від’єднує трубу від VFS, але процеси, які використовують її, все ще підтримують посилання на неї, поки вони не будуть закінчені.
Зауважте, використання $ * не обов'язково є безпечним.
#!/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