Решение для busybox, macOS bash и не-bash оболочек
Принятый ответ, безусловно, лучший выбор для bash. Я работаю в среде Busybox без доступа к bash, и он не понимает exec > >(tee log.txt)
синтаксис. Он также не работает exec >$PIPE
должным образом, пытаясь создать обычный файл с тем же именем, что и именованный канал, который не работает и зависает.
Надеюсь, это будет полезно для кого-то еще, у кого нет bash.
Кроме того, для любого, кто использует именованный канал, это безопасно 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