Solusi untuk busybox, macOS bash, dan cangkang non-bash
Jawaban yang diterima tentu saja merupakan pilihan terbaik untuk bash. Saya bekerja di lingkungan Busybox tanpa akses ke bash, dan itu tidak mengerti exec > >(tee log.txt)
sintaks. Itu juga tidak melakukan exec >$PIPE
dengan benar, mencoba membuat file biasa dengan nama yang sama dengan pipa bernama, yang gagal dan hang.
Semoga ini bermanfaat bagi orang lain yang tidak memiliki bash.
Juga, bagi siapa saja yang menggunakan pipa bernama, aman untuk itu rm $PIPE
, karena itu memutuskan tautan pipa dari VFS, tetapi proses yang menggunakannya masih mempertahankan jumlah referensi di atasnya sampai selesai.
Perhatikan penggunaan $ * belum tentu aman.
#!/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